什么是注解(Annotation),注解是放在Java源码的类、方法、字段、参数前的一种特殊注释,比如我们常常使用的Spring Boot框架,经常会用到@NotNull, @NotEmpty, @NotBlank, 这些都是系统框架写好的注解, 接下来要做的是实现自己的注解
添加依赖
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
方式一:
import javax.validation.Constraint;
import javax.validation.OverridesAttribute;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import java.lang.annotation.*;
@ReportAsSingleViolation //控制多个message的输出,只输出优先级高的message
@Documented //注解可以写入用户文档中
@Constraint(validatedBy = { })
@Target({ElementType.METHOD, ElementType.FIELD}) //定义能够被应用的位置(类、方法、字段...)
@Retention(RetentionPolicy.RUNTIME) //注解的周期, 一般为运行期RUNTIME
@Repeatable(MyLength.List.class) //定义是否可以重复
public @interface MyLength {
String message() default "{length error}"; //输出的消息
Class<?>[] groups() default {}; //分组验证
Class<? extends Payload>[] payload() default {}; //验证一些元数据信息
@OverridesAttribute(constraint = Max.class, name = "max") int max() default Integer.MAX_VALUE;
@OverridesAttribute(constraint = Min.class, name = "min") int min() default 1;
@Documented
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface List {
MyLength[] value();
}
}
方式二
import javax.validation.Constraint;
import javax.validation.Payload;
import javax.validation.ReportAsSingleViolation;
import java.lang.annotation.*;
@ReportAsSingleViolation //控制多个message的输出,只输出优先级高的message
@Documented //注解可以写入用户文档中
@Constraint(validatedBy = MyLengthValidator.class) //具体的实现
@Target({ElementType.METHOD, ElementType.FIELD}) //定义能够被应用的位置(类、方法、字段...)
@Retention(RetentionPolicy.RUNTIME) //注解的周期, 一般为运行期RUNTIME
@Repeatable(MyLength.List.class) //定义是否可以重复
public @interface MyLength {
String message() default "{length error}"; //输出的消息
int length();
Class<?>[] groups() default {}; //分组验证
Class<? extends Payload>[] payload() default {}; //验证一些元数据信息
@Documented
@Target({ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface List {
MyLength[] value();
}
}
实现具体的功能MyLengthValidator
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class MyLengthValidator implements ConstraintValidator<MyLength, Object> {
private int valueLength;
@Override
public void initialize(MyLength constraintAnnotation) {
valueLength = constraintAnnotation.length();
}
@Override
public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
String message = constraintValidatorContext.getDefaultConstraintMessageTemplate();
if (o == null || o.toString().equals("")) {
constraintValidatorContext.disableDefaultConstraintViolation(); //禁用默认的message值
constraintValidatorContext.buildConstraintViolationWithTemplate(message+"不能为空").addConstraintViolation();
return false;
}
if (o.toString().length() > valueLength) {
constraintValidatorContext.disableDefaultConstraintViolation(); //禁用默认的message值
constraintValidatorContext.buildConstraintViolationWithTemplate(message+"不能超过"+valueLength).addConstraintViolation();
return false;
}
return true;
}
}
以上就是两种自定义注解的实现方式,使用和@NotNull一样直接加在字段或者方法上面
5745

被折叠的 条评论
为什么被折叠?



