一款常用的后端校验框架,官方链接

依赖

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-validation</artifactId>
  4. </dependency>

基本使用

Domain Model模型参数

  1. 在Domain Model的getter或成员变量上加校验注解 ```java import lombok.Data;

import javax.validation.constraints.NotBlank;

@Data public class DictType { //主键 private Integer id;

  1. @NotBlank(message = "名称不能为空")
  2. private String name;
  3. @NotBlank(message = "值称不能为空")
  4. private String value;
  5. //简介
  6. private String intro;

}

  1. 2. 在使用Domain Model参数前加@Valid
  2. ```java
  3. @PostMapping("/save")
  4. public Map<String,Object> save(@Valid DictType dictType)
  5. {
  6. }

当校验失败时会抛出异常

  1. org.springframework.validation.BindException

可以通过BindException.getBindingResult().getAllErrors()拿到所有异常信息

非Domain Model的方法参数

方法的参数是String、基本类型等

  1. @PostMapping("/remove")
  2. public Map<String,Object> remove(String id)
  3. {
  4. }

校验步骤:

  1. 在Controller上加@Validated注解
  2. 在方法参数前加校验注解

    1. @RestController
    2. @Validated //步骤1
    3. public class DictTypeController {
    4. @PostMapping("/remove")
    5. public Map<String,Object> remove( @NotBlank(message = "id不能为空") String id)//步骤2
    6. {
    7. }
    8. }

    校验失败时,会抛出如下异常

    1. javax.validation.ConstraintViolationException

    可以通过ConstraintViolationException异常的getConstraintViolations()方法获取所有的异常信息

快速抛出异常

一个方法里面可能存在很多个检测注解

  1. public Map<String,Object> remove( @NotBlank(message = "id不能为空") @NotEmpty(message = "id不能为空且长度大于0") String id)
  2. {
  3. }

默认情况下检查所有的错误后再统一抛出,如果想当检测到一个错误后就直接抛出异常,不再往下检测,可以进行如下配置,只需把Validator加到Spring容器中即可

  1. @Configuration
  2. public class ValidatorCfg {
  3. @Bean
  4. public Validator validator() {
  5. ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class )
  6. .configure()
  7. .failFast(true)
  8. .buildValidatorFactory();
  9. return validatorFactory.getValidator();
  10. }
  11. }

自定义校验

  1. @Documented
  2. @Target(ElementType.FIELD)
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Constraint(validatedBy = BoolNumber.BoolNumberValidator.class)
  5. public @interface BoolNumber {
  6. //message、groups、payload可以理解固定写法,不写就会报错
  7. String message() default "只能是0或1";
  8. Class<?>[] groups() default {};
  9. Class<? extends Payload>[] payload() default {};
  10. //BoolNumber为注解名称,这里的Short为要验证的值的类型是什么类型,这里为short类型
  11. class BoolNumberValidator implements ConstraintValidator<BoolNumber, Short> {
  12. @Override
  13. public boolean isValid(Short num,
  14. ConstraintValidatorContext constraintValidatorContext) {
  15. //返回false校验失败,会抛出异常
  16. return num == null || num == 0 || num == 1;
  17. }
  18. }
  19. }

�外界使用

  1. import lombok.Data;
  2. @Data
  3. public class DictItem {
  4. //是否禁用。0代表不禁用(启用),1代表禁用
  5. @BoolNumber
  6. private Short disabled;
  7. }