自定义注解
自定义注解
以实战案例为驱动,快速掌握此怎么自己自定义注解,也好出去自己吹牛逼~哈哈哈
假设我们打车,需要检验验证码,我们需要一个注解字来进行核验,我们怎么操作呢?
大纲总览
1.定义注解
可以自己创一个包单门存放自己的注解: 如
constraints
包然后我们在此包下创建一个注解的接口
package com.boyunv.apipassenger.constraints;
import javax.validation.Constraint;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/*
*@description
*
*@author boyunv
*@create 2023/12/17 9:47
*@version 1.0
*/
@Target(ElementType.FIELD) //此注解表明我们定义的注解作用在属性上
@Retention(RetentionPolicy.RUNTIME) //表明注解在运行时生效
@Constraint(validatedBy = VehicleTypeCheckValidator.class) //validatedBy: 声明你要校验的是哪个类 (这个关键字很重要)
public @interface VehicleTypeCheck {
/**
* 车辆类型的选项(举例)
* @return
*/
String[] vehicleTypeValue() default{};
/**
* 提示信息
* @return
*/
String message() default "车辆类型不正确";
}
2.解析注解
定义一个类:
VehicleTypeCheckValidator.java
实现继承:
ConstraintValidator
package com.boyunv.apipassenger.constraints;
/*
*@description
* 解析注解
*@author boyunv
*@create 2023/12/17 9:55
*@version 1.0
*/
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;
/**
* ConstraintValidator: 必须继承的类
* 实现的泛型: VehicleTypeCheck: 定义注解接口 String: 结果
*
*/
public class VehicleTypeCheckValidator implements ConstraintValidator<VehicleTypeCheck,String> {
//定义一个集合接受注解中信息
private List<String> vehicleTypeCheckValue=null;
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if(vehicleTypeCheckValue.contains(s)){
return true ;
}
return false;
}
@Override
public void initialize(VehicleTypeCheck constraintAnnotation) {
//拿取传来的数组信息
vehicleTypeCheckValue= Arrays.asList(constraintAnnotation.vehicleTypeValue());
ConstraintValidator.super.initialize(constraintAnnotation);
}
}
3.使用注解
直接看下面的定义,这一步就很简单
package com.boyunv.apipassenger.request;
/*
*@description
* 使用注解
*@author boyunv
*@create 2023/12/17 10:04
*@version 1.0
*/
import com.boyunv.apipassenger.constraints.VehicleTypeCheck;
import javax.validation.constraints.NotBlank;
public class ForecastPriceDTO {
@NotBlank(message = "车辆类型不正确")
@VehicleTypeCheck(vehicleTypeValue = {"1","2"}) //这就是我们要往解析注解传的数组信息
private String vehicleType;
}