使用postman
来请求试一试,结果如下!
- 不传
sex
参数
很清晰的看到,已经生效!
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
进行入参属性绑定,然后再进行校验!
validateIfApplicable
方法逻辑,会遍历当前参数methodParam
所有的注解,如果注解是@Validated
或者注解的名字以Valid
开头,则使用WebDataBinder
对象执行校验逻辑。
方法参数解析器只针对接口请求时入参进行验证,如果想对任何组件中方法进行注解校验,似乎还缺了点什么!
而当需要对一个类中的方法参数使用注解校验时,在类上加上@Validated
就是为了告诉Spring
去校验方法参数!
底层核心是通过切面代理类并配合MethodValidationPostProcessor
这个后置处理器进行处理!
四、总结
参数验证,在开发中使用非常频繁,如何优雅的进行验证,让代码变得更加可读,是业界大佬一直在追求的目标!
本文主要是对自己在项目中的实际使用到参数验证方式加一整理,希望能帮助到各位网友!