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 才生效
 * <pre>
 *     @Bean
 *     public MethodValidationPostProcessor methodValidationPostProcessor() {
 *         return new MethodValidationPostProcessor();
 *     }
 * </pre>
 * @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 验证的话,需要单独配置拦截器

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值