在开发的过程中,为了确保数据的准确性、可靠性和减少脏数据等,我们时常需要对入参进行校验,以往是通过条件判断去实现参数校验,但是这样费时费力又效果不好,而参数校验对于我们来说是一个非常高效的开发工具。
目录
一、基本使用
1、引入依赖
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2、实体类使用
给需要进行校验的字段加注解
@Data
@ApiModel(value = "user", description = "用户属性")
public class UserDTO {
@NotEmpty(message = "姓名不能为空")
@ApiModelProperty(value = "姓名")
private String userName;
@NotNull(message = "年龄不能为空")
@ApiModelProperty(value = "年龄")
private Integer userAge;
}
- @NotEmpty:集合对象的元素不为 0 ,即集合不为空 。
- @NotNull:不能为 null 。
3、Controller层使用
@PostMapping("/users")
@ApiOperation(value = "查询用户信息")
@ApiOperationSupport(order=1) //api文档排序
public UserVO getUser(@Validated @RequestBody UserDTO dto) {
return userService.getUser(dto);
}
Valid 和 Validated 区别
1.分组
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。
@Valid:作为标准JSR-303规范,还没有吸收分组的功能。
2.注解地方
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上。
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上。
3.嵌套验证
@Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证。能配合嵌套验证注解@Valid进行嵌套验证。
4、结果
{
"code": 500,
"data": null,
"msg": "姓名不能为空"
}
{
"code": 500,
"data": null,
"msg": "年龄不能为空"
}
注意:若结果只有报错信息,并没有像我们定义的那样展示提示信息,则需要加上异常捕获再抛出
// 异常捕获
package com.basic.common.core.exception;
import com.basic.common.core.rest.Rest;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* 异常处理器
*/
@RestControllerAdvice
public class BasicExceptionHandler {
/**
* 全局异常捕捉处理
*/
@ExceptionHandler(value = Exception.class)
public Rest<?> errorHandler(Exception ex) {
Rest<?> resultWrapper = new Rest<>();
if (ex instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException exs = (MethodArgumentNotValidException) ex;
resultWrapper.setCode(500);
resultWrapper.setMsg(getBindingResultMessage(exs.getBindingResult()));
}
return resultWrapper;
}
private String getBindingResultMessage(BindingResult bindingResult) {
StringBuilder sb = new StringBuilder();
for (ObjectError error : bindingResult.getAllErrors()) {
sb.append(",").append(error.getDefaultMessage());
}
if (sb.length() > 0) {
sb.deleteCharat(0);
}
return sb.toString();
}
}
5、常见的参数校验
注解 |
说明 |
@Null |
限制只能为null |
@NotNull |
限制必须不为null |
@NotBlank |
限制字符串不为null,且字符串.trim()以后length要大于0 |
@NotEmpty |
限制集合对象的元素不为0,即集合不为空 |
@AssertFalse |
限制必须为false |
@AssertTrue |
限制必须为true |
@DecimalMax(value) @Max(value) |
限制必须为一个不大于指定值的数字 |
@DecimalMin(value) @Min(value) |
限制必须为一个不小于指定值的数字 |
@Digits(integer,fraction) |
限制必须为一个小数,且整数部分位数不能超过integer,小数部分的位数不能超过fraction |
@Pattern(value) |
限制必须符合指定的正则表达式 |
@size(max,min) |
限制字符长度再min到max之间 |
|
限制字符必须是Email格式,也可以通过正则表达式指定 |
二、分组校验
我们常遇上一个入参对象需要应多多种接口方法,但是有些方法只需要对部分字段进行校验,而另一些方法又只需要对另一部分的字段进行校验,这个时候分组校验就可以满足我们的需求。
1、增加用于辨别的接口类
① 方法一:定义接口类
package com.basic.demo.validation;
public interface AddGroup {
}
-------------------------------
package com.basic.demo.validation;
public interface UpdateGroup {
}
@Data
@ApiModel(value = "user", description = "用户属性")
public class UserDTO {
@NotEmpty(message = "姓名不能为空")
@ApiModelProperty(value = "姓名")
private String userName;
@NotNull(message = "年龄不能为空")
@ApiModelProperty(value = "年龄")
private Integer userAge;
//修改时生效
public interface UpdateGroup {
}
//新增时生效
public interface AddGroup {
}
}
2、增加group参数配置
① 字段标识
@NotEmpty(message = "姓名不能为空", groups = AddGroup.class)
@ApiModelProperty(value = "姓名")
private String userName;
@NotNull(message = "年龄不能为空", groups = {AddGroup.class, UpdateGroup.class})
@ApiModelProperty(value = "年龄")
private Integer userAge;
② 方法入参标识
@PostMapping("/users")
@ApiOperation(value = "查询用户信息")
public Rest<String> getUser(@Validated({AddGroup.class}) @RequestBody UserDTO dto) {
return Rest.ok("hello");
}
@PostMapping("/users")
@ApiOperation(value = "查询用户信息")
public UserVO getUser(@Validated({AddGroup.class, UpdateGroup.class}) @RequestBody UserDTO dto) {
return userService.getUser(dto);
}
这样就能实现针对不同的需求制定不同的参数校验啦!
小白也要努力成长起来!欢迎大家指点和讨论!
原文地址:https://www.jb51.cc/wenti/3286030.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。