在 Spring Boot 项目中,我们经常需要对参数进行校验。为了保证代码的规范性和可维护性,我们可以将参数校验的结果进行统一封装,以便于返回给前端一个格式化的错误信息。
下面是一个统一封装参数校验错误信息的例子:
引入相关依赖
在 pom.xml 文件中引入 spring-boot-starter-validation 依赖,它包含了 JSR-303 的校验框架
<!--validation-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
定义一个实体类
@Data
public class TestValidObj{
@NotBlank(message = "账号不能为空")
@ApiModelProperty(value = "账号")
private String username;
@ApiModelProperty(value = "密码")
@NotBlank(message = "密码不能为空不能为空")
@Size(min = 6,max = 20,message = "密码长度为6~20")
private String password;
@ApiModelProperty(value = "年龄")
private Integer age;
}
RestExceptionHandler 加入参数校验异常监控
/**
* 参数校验异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public <T> DataResult<T> methodArgumentNotValidException(MethodArgumentNotValidException e){
log.error("MethodArgumentNotValidException:{}",e);
String message=e.getAllErrors()
.stream()
.map(ObjectError::getDefaultMessage)
.collect(Collectors.joining(","));
return DataResult.fail(ResponseCode.DATA_PARAM_ERROR.getCode(), message);
}
测试
@PostMapping("/test-valid")
@ApiOperation(value ="参数校验测试接口")
public TestValidObj testValidObj(@RequestBody @Valid TestValidObj obj){
return obj;
}
常用的注解
| 注解 | 功能 |
|---|---|
| @AssertFalse | 可以为null,如果不为null的话必须为false |
| @AssertTrue | 可以为null,如果不为null的话必须为true |
| @Digits(integer=, fraction=,message=) | 被注解的元素必须为一个数字,其值必须在可接受的范围内 |
| @Max(value=,message=) | 被注解的元素必须为一个数字,其值必须小于等于指定的最大值 |
| @Min(value=,message=) | 被注解的元素必须为一个数字,其值必须大于等于指定的最小值 |
| @NotNull(message=) | 不能为null,可以是"" |
| @Null(message=) | 必须为null |
| @Pattern(regexp=,message) | 必须满足指定的正则表达式 |
| @Size(min=,max=,message=) | 集合、数组、map等的size()值必须在指定范围内 |
| @Email(message=) | 必须是email格式 |
| @NotBlank(message=) | 字符串不能为null,字符串trim()后也不能等于“” |
| @NotEmpty(message=) | 不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于“” |
| @Valid | 被注释的元素是一个对象,需要检查此对象的所有字段值 |