Spring Boot参数校验机制介绍及问题排查
背景
公司新的系统版本从Spring cloud Alibaba 微服务简化为Spring Boot的一个单服务,但是代码架构还是按照服务做了简单的模块划分。
接口系统上参数校验使用了 hibernate validator
, 这个包还是很好用的。hibernate validator 是对 Jakarta Bean Validation规范的实现的一种。
Jakarta Bean Validation 介绍
Jakarta Bean Validation 据说之前是Java Bean Validation, Bean Validation 技术隶属于Java EE规范,期间有多个JSR(Java Specification Request)支持(303、349、380),他是一种规范是标准,hibernate validator是对他的一种实现。所以处理几个JSR规定的一些规范注解外,hibernate validator 还提供了一些别的使用的注解。Spring Boot已经引用hibernate-validator包。所以我们Spring Boot项目不用单独导包,就可以直接使用。就像Jakarta Bean Validation 自己介绍说的
Constrain once, validate everywhere
附上文档地址:
问题
新的系统架构现在主要在开发测试阶段,自测开发的模块时发现参数校验的几个注解不生效(@NotBlank、@NotEmpty)。
几个注解的含义
@NotNull: 不能为null,但可以为empty,用在基本类型上。
@NotEmpty:不能为null,而且长度必须大于0,用在集合类上。
@NotBlank:不能为null,而且调用trim()后,长度必须大于0,只能作用在String上。
处理
- 最早出现这个问题时,随手查了下, 说是需要在controller层参数上加伤 @Valid注解,确实没有加,但是加上之后发现还是没有生效,但是@NotNull可以起作用(可惜它不能满足需求)。
- 继续肝,发现如果import的NotBlank的包,特意指定到hibernate-validator目录下的包就可以了,这里肯定有一些包上的问题。
- 使用 MavenHelper 和 mvn dependency:tree命令查找发现,项目里有个独立引用的hibernate-validator包而且版本比较老旧,直接干掉了。
- 问题解决。
另外
对于这个的检查结果,因为主要是在controller使用,建议做统一处理,可以使用@ControllerAdvice注解。
结论
spring boot项目不需要独立的引用hibernate-validator包,核心包里已经带了;另外包的版本变化还是挺大的哦。