1. @valid和校验注解
方法跟实体配合使用
- 实体
方法
-
2. 使用swagger文档时出现的问题
1. 当使用了2的验证方式出现了,参数变成了json,跑到了body中,找出了无法加载参数值
```java @RestController @RequestMapping(“user”) @Validated @Api(tags = “user - user”) public class UserController { @ApiOperation(“user - testNotBlank”)
@ApiMapping(value = “testNotBlank”,checkToken = false) public ResultVO login(@NotBlank(message =”userName不能为空”) String userName, String test) { return ResultVO.success(userName); } }
![image.png](https://cdn.nlark.com/yuque/0/2020/png/1642320/1597317298287-dc1ae541-efa8-405a-9a30-977d442f8845.png#crop=0&crop=0&crop=1&crop=1&height=446&id=TUK70&margin=%5Bobject%20Object%5D&name=image.png&originHeight=446&originWidth=1435&originalType=binary&ratio=1&rotation=0&showTitle=false&size=39420&status=done&style=none&title=&width=1435)![image.png](https://cdn.nlark.com/yuque/0/2020/png/1642320/1597317325658-c8ecc5cb-fc20-4532-a8f9-d1c8f47f23f6.png#crop=0&crop=0&crop=1&crop=1&height=382&id=L28IY&margin=%5Bobject%20Object%5D&name=image.png&originHeight=382&originWidth=1529&originalType=binary&ratio=1&rotation=0&showTitle=false&size=56822&status=done&style=none&title=&width=1529)
<a name="HIzGd"></a>
### 1. 解决方法
1. 使用@RequestParam
```java
@ApiOperation("user - testNotBlank")
@ApiMapping(value = "testNotBlank",checkToken = false)
public ResultVO login(@RequestParam @NotBlank(message ="userName不能为空") String userName, String test) {
return ResultVO.success(userName);
}
- 使用@paramType
@ApiOperation("user - testNotBlank")
@ApiMapping(value = "testNotBlank",checkToken = false)
@ApiImplicitParams({
@ApiImplicitParam(name = "userName",value = "用户名",type = "String",paramType = "query"),
@ApiImplicitParam(name = "test",value = "test",type = "String",paramType = "query"),
})
public ResultVO login(@NotBlank(message ="userName不能为空") String userName, String test) {
return ResultVO.success(userName);
}
- 实体
3. 验证注解
- @Null 限制只能为null
- @NotNull 限制必须不为null
- @AssertFalse 限制必须为false
- @AssertTrue 限制必须为true
- @DecimalMax(value) 限制必须为一个不大于指定值的数字
- @DecimalMin(value) 限制必须为一个不小于指定值的数字
- @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
- @Future 限制必须是一个将来的日期
- @Max(value) 限制必须为一个不大于指定值的数字
- @Min(value) 限制必须为一个不小于指定值的数字
- @Past 限制必须是一个过去的日期
- @Pattern(value) 限制必须符合指定的正则表达式
- @Past 验证注解的元素值(日期类型)比当前时间早
- @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
- @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格
- @Email 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
- @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之
- @Length(min=, max=) 验证字符串长度是否在给定的范围之内 | 注解名称 | 功能 | | —- | —- | | @Null | 检查该字段为空 | | @NotNull | 不能为null | | @NotBlank | 不能为空,常用于检查空字符串 | | @NotEmpty | 不能为空,多用于检测list是否size是0 | | @Max | 可用于数字和字符串(字符串必须为数值型),其值必须小于等于指定的最大值 | | @Min | 可用于数字和字符串(字符串必须为数值型),其值必须大于等于指定的最小值 | | @Past | 检查该字段的日期是在过去 | | @Future | 检查该字段的日期是否是属于将来的日期 | | @Email | 检查是否是一个有效的email地址 | | @Pattern(regex=,flag=) | 被注释的元素必须符合指定的正则表达式 | | @Range(min=,max=,message=) | 被注释的元素必须在合适的范围内 | | @Size(min=, max=) | 检查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等 | | @Length(min=,max=) | 检查所属的字段的长度是否在min和max之间,只能用于字符串 | | @AssertTrue | 用于boolean字段,该字段只能为true | | @AssertFalse | 该字段的值只能为false |
4. 全局异常捕获处理错误格式
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultVO<?> exception(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<ObjectError> allErrors = bindingResult.getAllErrors();
StringBuilder sb = new StringBuilder();
allErrors.forEach(objectError -> {
FieldError fieldError = (FieldError) objectError;
sb.append(";").append(fieldError.getField()).append(":").append(fieldError.getDefaultMessage());
});
String message = sb.length() > 0 ? sb.substring(1) : sb.toString();
return ResultVO.fail(ResultCodeEnum.CheckError.getCode(), message);
}