#springboot 自定义参数注解

#pom import

<!-- 根据 JSR 380 规范,validation-api依赖项包含标准验证 API -->
<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
    <version>2.0.1.Final</version>
</dependency>

<!-- Hibernate Validator 是验证 API 的参考实现 -->
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
</dependency>

注解实际没生效,大多因为少了第二个包没引入。第一个少了就编译不过了

#自定义注解

@Documented
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(DemoLength.List.class)
@Constraint(validateBy = {DemoLengthValidator.class})
public @interface DemoLength {
    
    long min() default 1;
    long max() default 10;
    
    String message() default "DemoLength validator annotation.";
    
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
    
    @Documented
	@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface List {
        DemoLength[] value();
    }
}

#具体实现类

public class DemoLengthValidator implements ConstraintValidator<DemoLength, Object> {
    private long min;
    private long max;
    
    @Override
    public void initialize(DemoLength constraintAnnotation) {
        this.min = constraintAnnotation.min();
        this.max = constraintAnnotation.max();
    }
    
    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        if (o == null) {
            return true;
        }
        if (o instanceof String) {
            int length ((String) o).length();
            return min <= length && length <= max;
        } else if (o instanceof Integer || o instanceof Long) {
            long val = ((Number) o).longValue();
            return min <= length && length <= max;
        }
        return false;
    }
}