Spring framework: Validation API

Spring Validation

org.springframework.validation

介绍

  • Spring Validation是原生的API,不依赖任何外部框架或规范

org.springframework.validation.Validator接口

  • 这里的Validator不是jakarta.validation.Validator
  • 仅包含两个方法:
    • boolean supports(Class<?>):检验该验证器是否支持指定的类
    • void validate(T obj, Errors):检验obj,将错误信息交给Errors引用 对比jakarta.validation.Validatorvalidate()方法,它将错误信息交给返回值Set<ConstraintViolation<T>>

Errors接口

  • Errors接口包含一系列方法用于获取错误信息

  • reject(String errorCode):注册一个全局的错误,errorCode若要分层,风格可使用.符号分隔不同层

    reject(String errorCode, String message):使用自定义错误信息

  • rejectValue(String field, String errorCode, String message):对特定字段field注册一个错误

  • hasErrors():判断是否有错误

    hasGlobalErrors():判断是否有全局错误

    hasFieldErrors(String Field):判断是否有特定字段错误

  • List<ObjectError> getGlobalErrors():获取所有全局错误

    FieldError getFieldError(String field):获取指定的字段错误

    List<FieldError> getFieldErrors():获取所有字段错误

BindingResult接口

  • BindingResult继承了Errors接口
  • Object getTarget():获取发生错误的目标对象

集成Bean Validation API

  • Spring使用适配器模式将Spring ValidationBean Validation API集成起来

    LocalValidatorFactoryBean是一个org.springframework.validation.Validator,内部使用一个jakarta.validation.Validator的实现(一般是Hibernate)从而支持注解形式的验证API,它同时也是一个FactoryBean,因此可以通过IoC容器管理

  • @Validated是一个Spring额外提供的注解,比起@Valid,它提供分组功能,分组使用方法和Bean Validation API里的groups属性类似

  • Spring MVC的联动:在方法参数中使用@Valid@Validated或其它的注解约束,由容器会自动进行校验,并将抛出的异常赋给BindingResult对象自动注入

    也可定义@ExceptionHandler方法处理