使用步骤
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
2.异常拦截类
/**
* 全局异常处理
*/
@Slf4j
@RestControllerAdvice
public class GlobalExcepitonHandler {
/**
* 处理Assert的异常
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = IllegalArgumentException.class)
public Result handler(IllegalArgumentException e) throws IOException {
log.error("Assert异常:-------------->{}",e.getMessage());
return Result.fail(e.getMessage());
}
/**
* @Validated 校验错误异常处理
*/
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public Result handler(MethodArgumentNotValidException e) throws IOException {
log.error("运行时异常:-------------->",e);
BindingResult bindingResult = e.getBindingResult();
ObjectError objectError = bindingResult.getAllErrors().stream().findFirst().get();
return Result.fail(objectError.getDefaultMessage());
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(value = RuntimeException.class)
public Result handler(RuntimeException e) throws IOException {
log.error("运行时异常:-------------->",e);
return Result.fail(e.getMessage());
}
}
3.测试
@Data
public class LoginDto {
@NotBlank(message = "账号不能为空")
private String no;
@NotBlank(message = "密码不能为空")
private String password;
}
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Integer id;
// 每一个注解都包含了message字段,用于校验失败时作为提示信息。不写message将使用默认的错误提示信息。
@Size(min = 5, max = 10, message = "请输入5-10个字符的用户名")
private String username;
private String password;
@Min(18)
private Integer age;
@NotBlank(message = "手机号码不能为空")
@Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$", message = "手机号码格式错误")
private String phone;
@Email(message = "邮箱格式错误")
private String email;
@NotNull(message = "生日不能为空")
@Past // 生日必须是一个过去的时间
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
}
常用标签
常用三个标签的区别:@NotBlank,@NotNull,@NotEmpty
@NotEmpty用在集合类上面,不能为null,并且长度必须大于0@NotBlank 用在String上面,只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@NotNull 用在基本类型上,不能为null,但可以为空字符串
其他数据校验注解
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式
// Hibernate Validator提供的校验注解:
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内
group分组校验
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@NotBlank(message = "课程名字不能为空",groups = {Save.class})
private String name;
private String url;
public @interface Save {
}
public @interface Edit {
}
}
/**
* 新增课程
*/
@CrossOrigin(originPatterns = "*", maxAge = 3600)
@PostMapping("/insert")
public Result insert(@RequestBody @Validated({Course.Save.class}) Course course) {
return Result.succ("");
}
/**
* 更新课程
*/
@CrossOrigin(originPatterns = "*", maxAge = 3600)
@PostMapping("/update1")
public Result update1(@RequestBody @Validated({Course.Edit.class}) Course course) {
return Result.succ("");
}
补充