阿粉写了八千多字,只为讲透参数合法性验证)(四)

简介: 最近很多读者给阿粉留言,说怎么好久没看到我的文章了,这里说一下。 由于公众号不再按时间线排序,所以你会发现有时候能看到几天前的文章,这不是出BUG,是公众号的一次改变。 至于排序的具体标准是啥,阿粉也不太清楚,大概和你打开某个公众号的频率有关。 所以如果你想第一时间收到阿粉的文章,可以点击Java极客技术的的头像,再点右上角三个点,进去设置一下【星标】。

使用postman来请求试一试,结果如下!

  • 不传sex参数

30.jpg很清晰的看到,已经生效!

3.5、手动进行注解校验

某些时候呢,假如有100个类需要用到校验注解,此时我们可能在每个类会加上注解@Validated或者@Valid,再增加100个这样的类,就会造成很多大量的重复工作。

而此时,我们的诉求是想对有校验注解的实体类进行全局参数验证

解决办法就会用到Validator提供的手动注解校验证工具类,实现方法如下!

  • 新建一个注解验证工具类
/**
 * 注解校验工具类
 */
public class ValidatorUtils {
    /**
     * 获取对象中所有注解校验证异常信息
     * @param object
     * @return
     */
    public static String validated(Object object){
        List<String> errorMessageList = new ArrayList<>();
  //获取注解校验工厂
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        Validator validator = factory.getValidator();
        Set<ConstraintViolation<Object>> violations = validator.validate(object);
        for (ConstraintViolation<Object> constraintViolation : violations) {
            errorMessageList.add(constraintViolation.getMessage());
        }
        return errorMessageList.toString();
    }
}
  • 使用ValidatorUtils工具类,对参数进行验证
@Test
public void testUser(){
    User user = new User();
    System.out.println(ValidatorUtils.validated(user));
}

执行之后,结果如下!

[邮箱不能为空!, 用户名不能为空!, 密码不能为空!, 确认密码不能为空!, 性别输入有误!]

当然你还可以对ValidatorUtils类进行改造,当有异常信息的时候,直接抛异常!

同时,你还可以通过@Autowired直接注入的方式来获取Validator对象!

@Autowired
Validator validator

3.6、spring 注解校验原理

如果你对springmvc的方法参数解析器(HandlerMethodArgumentResolver)了解的话,就可能会想到参数校验这块肯定是在对应的方法参数解析器里执行的。

直接定位到resolveArgument这个方法,先通过WebDataBinder进行入参属性绑定,然后再进行校验!

31.jpg


validateIfApplicable方法逻辑,会遍历当前参数methodParam所有的注解,如果注解是@Validated或者注解的名字以Valid开头,则使用WebDataBinder对象执行校验逻辑。

32.jpg

方法参数解析器只针对接口请求时入参进行验证,如果想对任何组件中方法进行注解校验,似乎还缺了点什么!

而当需要对一个类中的方法参数使用注解校验时,在类上加上@Validated就是为了告诉Spring去校验方法参数!

底层核心是通过切面代理类并配合MethodValidationPostProcessor这个后置处理器进行处理!

33.jpg

四、总结

参数验证,在开发中使用非常频繁,如何优雅的进行验证,让代码变得更加可读,是业界大佬一直在追求的目标!

本文主要是对自己在项目中的实际使用到参数验证方式加一整理,希望能帮助到各位网友!

相关文章
(续集)记录2分钟破解知识星球验证弹窗
那我换个思路,反正网站简单,这次直接用替换的方式
1269 0
|
XML Web App开发 存储
这个文件下载问题难住了我至少三位同事
这个文件下载问题难住了我至少三位同事
|
数据采集 算法
拒绝想当然,不看文档导致GNE 的隐秘 bug
拒绝想当然,不看文档导致GNE 的隐秘 bug
112 0
|
机器学习/深度学习 编解码 并行计算
仅做两项修改,苹果就让StyleGANv2获得了3D生成能力
仅做两项修改,苹果就让StyleGANv2获得了3D生成能力
105 0
|
消息中间件 JavaScript 小程序
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
接了个变态需求:给定一个接口,要用户自定义动态实现并上传热部署,怎么搞?
|
测试技术
字符串a和他许久未见面的同父异母的b(模拟)(思维)
字符串a和他许久未见面的同父异母的b(模拟)(思维)
91 0
|
存储 SQL 关系型数据库
覆盖索引这回事算是整明白了
覆盖索引这回事算是整明白了
282 0
覆盖索引这回事算是整明白了
|
Java API 容器
JAVA泛型和通配符,再也不用每次百度了
JAVA泛型和通配符,再也不用每次百度了
173 0
JAVA泛型和通配符,再也不用每次百度了
|
Java 数据库连接 Spring
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
参数校验别再写满屏的 if/else 了,差点被劝退…(上)
131 0
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
参数校验别再写满屏的 if/else 了,差点被劝退……(下)
121 0