spring boot用java bean validation进行数据验证
文章目录
概述:以一个web项目中的用户注册服务为例子,介绍使用java bean validation进行数据验证的过程。
1.引入依赖
从spring boot 2.3开始,spring-boot-starter-validation
依赖独立出来了,2.3之前的版本,validation整合在spring-boot-starter-web
中,具体原因可以参考这个issue,所以请根据当前使用的spring boot版本选择相应依赖:
- spring boot 2.3+:
1 2 3 4
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
- spring boot 2.2及更早版本:
1 2 3 4
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.用注解对字段进行约束
注解可以自定义,大部分时候内置的就够用。内置的注解可以参考最新的jsr380,需要jdk8+支持,更早的jdk版本可以参考jsr303,jsr349等。
以User
类为例,用户名和密码不能为空,用户名长度4-20位:
|
|
注意:如果User
类中有其它封装的对象,要在这个对象上添加@Valid
注解来开启嵌套验证,才能让这个嵌套对象里面的@NotEmpty
等内部注解生效,这个特性支持层层嵌套。
3.在接收参数时使用@Valid启用验证
比如在Controller
层接收前端发送的用户名和密码,用User
类去接收RequestBody
的内容,添加@Valid
注解开启验证功能。这里也可以用@Validated
,两者的区别是:
@Valid
是java自带的,@Validated
是spring提供的,后者额外支持了一个group
特性@Valid
可以用在方法、方法参数、成员属性(支持嵌套验证)@Validatted
可以用在类、方法、方法参数,因为不能用在成员属性上,所以不支持嵌套验证,但可以配合@Valid
使用实现。
|
|
4.处理异常
如果数据验证没有问题,那么程序照常运行。如果验证不通过,则会抛出异常MethodArgumentNotValidException
,可以在@ControllerAdvice
中进行全局捕捉异常。e.getBindingResult().getFieldError().getDefaultMessage()
会输出定义约束时的message
信息,如上面的“用户名不能为空”。
|
|
5.补充说明
上面的例子用一个User
类来接收前端的数据,用@Valid
来开启验证,返回的是MethodArgumentNodValidException
,有时候,我们只对前端发送的一个参数进行直接验证,比如前端发送了一个用户名来查询一些信息,这时候可以直接对这个参数进行验证,但需要在类上添加@Validated
注解开启验证,如:
|
|
此时如果验证失败,则抛出ConstraintViolationException
,需要进行相应的异常处理。
版权声明 本博客使用CC BY-NC-SA 4.0许可协议(创意共享4.0:保留署名-非商业性使用-相同方式共享)。