SpringBoot-服务端参数验证-JSR-303验证框架

1. springboot 默认集成了 hibernate-validator,它默认是生效的,可以直接使用。

比如:

@RestController
@RequestMapping("/hibernate")
public class DefaultHibernateValidatorTestController {

    /**
     * Springboot 默认会验证 controller 层的 validator,使用的是默认实现 hibernate-validator。
     * 但是 hibernate-validator 只能对Object类型的属性进行校验,不能对单个的参数进行校验。下面的校验不生效
     * @param str
     * @return
     */
    @RequestMapping("/string")
    public OpResponse valiateString(@NotEmpty(message = "str不能为空") String str){
        return OpResponse.suc(str);
    }

    /**
     * 检验生效
     * @param foo
     * @return
     */
    @RequestMapping("/foo")
    public OpResponse valiateString(@Valid @NotNull Foo foo){
        return OpResponse.suc(foo);
    }

    static class Foo implements Serializable {
        @NotNull
        private Integer id;
        @NotEmpty
        private String name;
        ........
    }
}

 

2. hibernate-validator不支持基础类型的验证,springboot对其进行了扩展,添加了MethodValidationPostProcessor拦截器,可以实现对方法参数的校验。

例如:

/**
 * 对基础类型的验证,必须要在Controller类上加 @Validated,同时配置 MethodValidationPostProcessor 才生效
 * 
 *     @Bean
 *     public MethodValidationPostProcessor methodValidationPostProcessor() {
 *         return new MethodValidationPostProcessor();
 *     }
 * 
*
@link https://yezhwi.github.io/springboot/2017/11/17/SpringBoot-服务端参数验证-JSR-303验证框架 * Created by wangzhiyuan on 2018/8/20 */ @RestController @RequestMapping("/validate") @Validated public class ValidatorTestController { @Resource BizService bizService; @RequestMapping("/string") // 这个 @NotEmpty 是生效的 public OpResponse valiateString(@NotEmpty(message = "str不能为空") String str){ bizService.validateTest(str); return OpResponse.suc(str); } /** * 可以看出,springboot默认只会验证 controller 方法上的 validator 注解,而不会验证 controller 层以外的。所以,如果要在其他层使用 validator 验证的话,需要单独配置拦截器 * @return */ @RequestMapping("/blank") public OpResponse blank(){ String str = null; bizService.validateTest(str); bizService.validateFooTest(null); return OpResponse.suc(str); } }

 

3. springboot默认只会验证 controller 方法上的 validator 注解,而不会验证 controller 层以外的。所以,如果要在其他层使用 validator 验证的话,需要单独配置拦截器

 

你可能感兴趣的:(SpringBoot-服务端参数验证-JSR-303验证框架)