自定义注解
自定义注解
以实战案例为驱动,快速掌握此怎么自己自定义注解,也好出去自己吹牛逼~哈哈哈
假设我们打车,需要检验验证码,我们需要一个注解字来进行核验,我们怎么操作呢?
大纲总览
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;@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {if(vehicleTypeCheckValue.contains(s)){return true ;}return false;}@Overridepublic 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;
}