0%

Spring Boot参数校验机制介绍及问题排查

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

附上文档地址:

  1. hibernate validator
  2. Jakarta Bean Validation

问题

新的系统架构现在主要在开发测试阶段,自测开发的模块时发现参数校验的几个注解不生效(@NotBlank、@NotEmpty)。
几个注解的含义

@NotNull: 不能为null,但可以为empty,用在基本类型上。
@NotEmpty:不能为null,而且长度必须大于0,用在集合类上。
@NotBlank:不能为null,而且调用trim()后,长度必须大于0,只能作用在String上。

主要校验注解介绍文档传送门

处理

  1. 最早出现这个问题时,随手查了下, 说是需要在controller层参数上加伤 @Valid注解,确实没有加,但是加上之后发现还是没有生效,但是@NotNull可以起作用(可惜它不能满足需求)。
  2. 继续肝,发现如果import的NotBlank的包,特意指定到hibernate-validator目录下的包就可以了,这里肯定有一些包上的问题。
  3. 使用 MavenHelper 和 mvn dependency:tree命令查找发现,项目里有个独立引用的hibernate-validator包而且版本比较老旧,直接干掉了。
  4. 问题解决。

另外

对于这个的检查结果,因为主要是在controller使用,建议做统一处理,可以使用@ControllerAdvice注解。

结论

spring boot项目不需要独立的引用hibernate-validator包,核心包里已经带了;另外包的版本变化还是挺大的哦。