使用javax.validation去校验参数,可以避免过多的if判断。
- 对需要校验的入参类添加注解
public class TestVO {
/*** 用户ID*/
@NotNull(message = "用户id不能为空")
private Long userId;
/** 用户名*/
@NotBlank(message = "用户名不能为空")
@Length(max = 20, message = "用户名不能超过20个字符")
@Pattern(regexp = "^[a-zA-Z\u4E00-\u9FA5]+$", message = "只能包含汉子和字母")
private String username;
/**性别*/
private String sex;
}
- 在controller入参上添加Valid注解
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@RequestMapping("/aa")
public void aa(@RequestBody @Valid TestVO testVO) {
log.info("进来了");
}
}
- 在全局异常捕获类中添加捕获
全局捕获类见https://blog.csdn.net/zgsxhdzxl/article/details/103064163。
我这里只获取第一个错误信息
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public ResultObject<?> exception(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
List<ObjectError> allErrors = bindingResult.getAllErrors();
if (allErrors.size() > 0) {
ObjectError errorMsg = allErrors.get(0);
FieldError fieldError = (FieldError)errorMsg;
return ResultObject.error(ErrorCode.LACK_PARAMETER.getCode(), fieldError.getDefaultMessage());
}
return ResultObject.error(ErrorCode.SERVER_ERROR);
}
- 测试
常用注解 | ||
注解 | 类型 | 备注 |
@Future | java.util.Date 等 | 检查给定的日期比当前日期晚. |
@Past | java.util.Date 等 | 检查给定的日期比当前日期早 |
@Max | BigDecimal, BigInteger, byte, short, int, long 以及包装类 | 检查该值是否小于或等于约束条件中指定的最大值. |
@Min | BigDecimal, BigInteger, byte, short, int, long 以及包装类 | 检查该值是否大于或等于约束条件中指定的最小值. |
@NotNull | 任意类型 | 带注释的值不为null. |
@Null | 任意类型 | 带注释的值为null |
@Pattern(regexp ) | String | 检查该字符串是否能够在match指定的情况下被regex定义的正则表达式匹配 |
@Size(min=, max=) | String,Collection,Map,array | 检查带注释的元素的大小是否在最小值和最大值之间. |
@NotBlank | String | 值不为null 切不为"", 不为" " |
@NotEmpty | String,Collection,Map,array | 值不为null 或者没有值 |
@Range(min=, max=) | BigDecimal,String, BigInteger, byte, short, int, long 以及包装类 | 值是否位于(包含)指定的最小值和最大值之间。 |
@Length(min=, max=) | String | 确认带注释的字符串在min和max之间. |