首页  编辑  

Java validator参数有效性验证器注解和约束,Enum枚举约束

Tags: /Java/   Date Created:
SpringBoot中的Validated注解及其自定义约束:
SpringBoot使用Validation校验参数_springboot validation_justry_deng的博客-CSDN博客
SpringBoot中BeanValidation数据校验与优雅处理详解 - 天乔巴夏丶 - 博客园 (cnblogs.com)

SpringBoot Validator 如果不生效,可能是缺少了依赖引入,一定要在Pom.xml中,添加下面的依赖:
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
例如,实现一个start & end date的约束,约束POJO类中,Start <= End date,否则报错。
首先定义一个 Interface注解类:
然后,实现约束类的实现代码,此处没有用反射,而是用BeanUtils来获取属性数据,更安全可靠一点。
最后,使用的时候,在数据POJO类使用即可:


如果要让Controller中RequestParam 参数生效,必须在类上使用 @Validated 注解,否则方法名中的 @Min, @Max, 等注解不会生效,如下:
  1. @RestController
  2. @Validated
  3. @RequestMapping("/data")
  4. public class DataController {
  5.     @GetMapping("/query")
  6.     public ResponseEntity<APIResult<Object>> query(@RequestParam
  7.                                                    @Max(value = 100@Min(value = -1)
  8.                                                    @Digits(message = "ID must be int", fraction = 0, integer = 10)
  9.                                                    @NotEmpty(message = "id is required")
  10.                                                    String id) {
  11.         return ResponseEntity.ok().body(APIResult.ok(id));
  12.     }
  13. }
如果不加 @Validated,上述代码中下划线的不会不会生效,切记。

枚举约束:
Enum.java

  1. import javax.validation.Constraint;
  2. import javax.validation.Payload;
  3. import java.lang.annotation.Documented;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. import static java.lang.annotation.ElementType.*;
  8. @Target({METHODFIELDANNOTATION_TYPECONSTRUCTORPARAMETERTYPE_USE})
  9. @Retention(RetentionPolicy.RUNTIME)
  10. @Documented
  11. @Constraint(validatedBy = EnumConstraintValidator.class)
  12. public @interface Enum {
  13.     String message() default "Invalid enum value";
  14.     Class<?>[] groups() default {};
  15.     Class<? extends Payload>[] payload() default {};
  16.     Class<? extends java.lang.Enum<?>> clazz();
  17. }
EnumConstraintValidator.java
  1. import javax.validation.ConstraintValidator;
  2. import javax.validation.ConstraintValidatorContext;
  3. import java.util.Arrays;
  4. import java.util.List;
  5. import java.util.stream.Collectors;
  6. public class EnumConstraintValidator implements ConstraintValidator<Enumjava.lang.Enum<?>> {
  7.     private List<String> valueList;
  8.     @Override
  9.     public void initialize(Enum constraintAnnotation) {
  10.         valueList = Arrays.stream(constraintAnnotation.clazz().getEnumConstants())
  11.                 .map(e -> e.name().toUpperCase()).collect(Collectors.toList());
  12.     }
  13.     @Override
  14.     public boolean isValid(java.lang.Enum<?> value, ConstraintValidatorContext constraintValidatorContext) {
  15.         return value == null || valueList.contains(value.name().toUpperCase());
  16.     }
  17. }
使用:
@Enum(message = "Wrong value", clazz = Type.class, groups = ValidGroups.Query.class)
private Type type;