我不能一下腰缠万贯,那就选择积少成多;我不能一下穿石而过,那就选择水滴石穿
@Valid注解 主要用于表单验证,减少代码量,无需在service层用代码校验
相关注解:
@NotNull(message = “不能为空”) // 不能为null,但可以为empty
@NotEmpty(message = “不能为空”) // 不能为null,而且长度必须大于0
@NotBlank(message = “不能为空”) // 只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@Length(min = 2, max = 4, message = “最少2字最多4字”) // 检查所属的字段的长度是否在min和max之间,只能用于字符串
@Size(min = 1, max = 10, message = “不在范围内”) // 查该字段的size是否在min和max之间,可以是字符串、数组、集合、Map等
@Range(min = 0, max = 100, message = “最小值为0,最大值为100”) // 数字类型(原子和包装) 限定数字范围(长整型)
@Future(message = “生日必须是过去的日期”) // 限制必须是一个过去的日期
@Past(message = “下一年生日必须是将来的日期”) // 限制必须是一个将来的日期
@Pattern(regexp = “^(((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(16[6])|(17[0135678])|(18[0-9])|(19[89]))\d{8})$”, message = “手机号格式错误”) // 限制必须符合指定的正则表达式
@Email(message = “邮箱格式不正确”) // 验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式
@AssertTrue(message = “该字段只能为true”) // 限制必须为true
@AssertFalse(message = “该字段只能为false”) // 限制必须为false
@Digits(integer = 100, fraction = 2, message = “整数不能超过100,小数不能超过2位”) // 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
@DecimalMax(value = “1.5”, message = “不能大于1.5”) // 限定数字的最大值,可以是小数
@DecimalMin(value = “1.5”, message = “不能小于1.5”) // 限定数字的最小值,可以是小数
@Max(value = 100,message = “不能大于100”) // 限定数字的最大值(整型)
@Min(value = 100,message = “不能小于100”) // 限定数字的最大值(整型)
@Null(message = “必须为null值”) // 元素必须为null
使用方法:
1、实体类
/**
* @author loveLetter
* @create 2023/5/8
* @description:@Valid及部分相关注解演示
*/
@Data
public class ValidDemo {
@NotNull(message = "ID不能为空")
private Integer id;
@NotBlank(message = "名字不能为空")
@Length(min = 2, max = 4, message = "名字最少2字最多4字")
private String name;
@NotNull(message = "年龄不能为空")
@Range(min = 0, max = 100, message = "年龄最小为0,最大为100")
private Integer age;
@NotNull(message = "生日不能为空")
@Future(message = "生日必须是过去的日期")
private Date birthday;
@NotNull(message = "下一年生日不能为空")
@Past(message = "生日必须是过去的日期下一年生日必须是将来的日期")
private Date nextYearBirthday;
@NotBlank(message = "电话不能为空")
@Pattern(regexp = "^(((13[0-9])|(14[579])|(15([0-3]|[5-9]))|(16[6])|(17[0135678])|(18[0-9])|(19[89]))\\d{8})$", message = "手机号格式错误")
private String phoneNumber;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式不正确")
private String email;
@AssertTrue(message = "该字段只能为true")
private boolean salaryIncrease;
@AssertFalse(message = "该字段只能为false")
private boolean payCuts;
@Digits(integer = 100, fraction = 2, message = "整数不能超过100,小数不能超过2位")
private BigDecimal money;
}
2、controller层
@PostMapping("/register")
public Result register(@Valid @RequestBody ValidDemo validDemo){
return userService.register(validDemo);
}
3、捕捉全局异常
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(MethodArgumentNotValidException.class)
public RpcResult<Object> handleValidationExceptions(MethodArgumentNotValidException ex) {
// 返回结果类RpcResult需自己定义 code返回编码 message返回信息
RpcResult<Object> result = ResultWrap.newResult(PARAM_IS_INVALID.code(),
PARAM_IS_INVALID.getMessage());
Map<String, Object> errors = new HashMap<>();
try {
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
} finally {
log.error("GLOBAL-EXCEPTION handleValidationExceptions {} result={}", ex.getStackTrace(),
JSON.toJSONString(errors));
result.setData(errors);
}
return result;
}
}
欢迎评论区补充!!!