前言
以手机号格式的校验为例:包括是否为空,位数是否为11位,和手机号数字格式
一、@Valid介绍
@Valid 注解通常用于对象属性字段的规则检测
二、使用步骤
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.定义约束
代码如下(示例):
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PhoneNum {
@NotBlank(message = "电话不能空")
@Size(min = 11, max = 11, 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 phone;
//其他数据
}
3.处理异常
不满足规则条件会抛出MethodArgumentNotValidException异常,我们需要捕捉处理这个异常
@ControllerAdvice
@Slf4j
public class GlobalException {
///手机号格式异常处理
@ResponseBody
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResultJson exceptionHandler(MethodArgumentNotValidException e)
{
log.error(e.getMessage(),e);
return ResultJson.error(ResultCode.SMS_ERROR_CODE.getCode(),e.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining()));
}
全局异常处理
@ExceptionHandler(Exception.class)
@ResponseBody
public Object labRunException(Exception e) {
log.error(e.getMessage(),e);
if(!HttpContextUtils.isAjax()){
ModelAndView mv = new ModelAndView();
mv.setViewName("/unknown");
return mv;
}else{
return ResultJson.error(e.getMessage());
}
}
}
异常匹配类型有就近原则,但是这两个异常要放在一个异常类中,否则会按照装配顺序执行,不一定会抛出目标异常
4 .Controller层方法测试
必须加@Valid注解
@RequestMapping("phone")
public ResultJson setPhoneNum(
@Valid @RequestBody
PhoneNum phoneNum)
{
System.out.println(phoneNum.getPhone());
return ResultJson.ok(phoneNum);
}
ResultJson自定义返回前端的格式
待改进:没有返回具体未满足的条件