SpringBoot校验和全局异常处理
引入依赖
- 在使用校验机制时,需要引入如下依赖
1 | <--! 在这里必须使用6.0以下的版本--> |
约束性注解说明
- 关于实体类或参数的一些注解
注解 | 功能 |
---|---|
@NotNull | 不能为null |
@Null | 必须为null |
@NotBlank | 字符串不能为null,字符串trim()后也不能等于“” |
@NotEmpty | 不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于“” |
@Max | 最大不能超过 |
@Min | 最小不能超过 |
@Digits(integer = x, fraction = y) | 设置必须是数字且数字整数的位数不超过x和小数的位数不超过y |
@Length | 字符串长度必须在指定范围内 |
@Past | 日期必须在当前日期的过去 |
@Future | 日期必须在当前日期的未来 |
@DecimalMax | 设置不能超过最大值 |
@DecimalMin | 设置不能超过最小值 |
@AssertFalse | 可以为null,如果不为null的话必须为false |
@AssertTrue | 可以为null,如果不为null的话必须为true |
@Range | 值必须在指定范围内 |
@Size | 集合、数组、map等的size()值必须在指定范围内 |
必须是email格式 | |
@Pattern | 必须满足指定的正则表达式 |
@URL | 必须是一个URL |
- 实体类使用约束性注解:其中的message为校验失败的提示消息
1 | public class NewCoffeeRequest { |
@Valid和@Validated
注解的使用:
在参数的前面添加注解,代表该参数需要被校验,校验的内容就是约束性注解定义的内容
1 | "/", consumes = MediaType.APPLICATION_JSON_VALUE) (path = |
两者的区别:
@Valid是使用Hibernate validation的时候使用
@Validated是只用Spring Validator校验机制使用
注解位置:
@Validated:用在类型、方法和方法参数上。但不能用于成员属性(field)
@Valid:可以用在方法、构造函数、方法参数和成员属性(field)上
@Validated提供了分组的功能,可以在参数验证时,根据不同的分组采用不同的验证机制,而@Valid没有分组的功能。对一个参数需要多种验证方式时,可通过分配不同的组达到目的,具体的做法:
1
2
3
4
5
6
7
8
9
10
11//定义分组接口
public interface IGroupA {
}
public interface IGroupB {
}
//然后在@Validated注解中添加接口的类
"stu") (
public String addStu(@Validated({IGroupA.class}) @RequestBody StudentBean studentBean){
return "add student success";
}嵌套校验
一个待校验的实体类,如果其中还包含了待校验的对象,就需要在待校验的对象上加上@Valid注解,才能校验包含的对象,注意,这里不能使用@Validated。
SpringBoot中的异常处理
- @ControllerAdvice:用于捕获
Controller
层抛出的异常,如果添加@ResponseBody
返回信息则为JSON
格式,它将捕获@Controller层抛出的异常,使业务逻辑与异常处理剥离开。 - @RestControllerAdvice :相当于
@ControllerAdvice
与@ResponseBody
的结合体,它将捕获@Controller
和@RestController
层抛出的异常。 - @ExceptionHandler:用于同于处理一种异常,减少重复性代码。
自定义异常类
1 | (HttpStatus.BAD_REQUEST) |
自定义一个全局异常处理
1 | import javax.validation.ValidationException; |