在入参校验异常部分可能会抛出三种异常:
1.MethodArgumentNotValidException
2.BindException
3.ConstraintViolationException
一.MethodArgumentNotValidException
1.抛出条件(需要都满足):
(1)前端以“JSON”或“XML”形式提交数据:Content-Type: application/json、Content-Type: application/xml
(2)后端以“自定义封装类”(即JavaBean)形式接收JSON或XML形式数据
(3)Spring在解析JSON或XML形式数据,并将其映射到JavaBean对象中的同名属性时,若不满足校验规则,则抛出异常
2.使用:
(1)在controller方法形参表中,在用于接收参数的JavaBean对象前加上:@Valid @RequestBody
(2)在用于接收参数的JavaBean类里面,对要校验的属性加上JSR303响应校验注解,例如@NotNull、@NotEmpty等
(3)在全局异常处理类中捕获MethodArgumentNotValidException并进行处理
3.示例:
@PostMapping("/test")
public ResponseVO test(@RequestBody @Valid UserDTO userDTO){}
二.BindException
1.抛出条件(需要都满足):
(1)前端以“表单”形式提交数据:Content-Type: multipart/form-data
(2)后端以“自定义封装类”(即JavaBean)形式接收表单数据
(3)Spring在将表单数据映射到JavaBean对象中的同名属性时,若不满足校验规则,则抛出异常
2.使用:
(1)在controller方法形参表中,在用于接收参数的JavaBean对象前加上:@Valid
(2)在用于接收参数的JavaBean类里面,对要校验的属性加上JSR303响应校验注解,例如@NotNull、@NotEmpty等
(3)在全局异常处理类中捕获BindException并进行处理
3.示例
@PostMapping("/test")
public ResponseVO test(@Valid UserDTO userDTO){}
三.ConstraintViolationException
1.抛出条件(需要都满足):
(1)前端以“表单”形式提交数据:Content-Type: multipart/form-data
(2)后端“不使用封装类”,而是在方法形参中使用多个Java提供的类对象,如Integer、String等去映射表单数据。每个表单项对应一个同名接收对象
(3)Spring在将表单数据映射到每个方法形参中的同名对象时,若不满足校验规则,则抛出异常
2.使用:
(1)在整个Controller类上,加上@Validated
(2)对方法形参中每一个用于接收表单数据的Java对象,加上JSR303响应校验注解,例如@NotNull、@NotEmpty等
(3)在全局异常处理类中捕获ConstraintViolationException并进行处理
3.示例
@Validated
@RestController
public class UserController{
@PostMapping("/test")
public ResponseVO test(@NotEmpty String userId,@NotNull String password){}
}
四.总结
1.MethodArgumentNotValidException是BindException的子类,这两个异常类是同一族的,因此使用上有共同点
(1)都是以“封装类对象”去接收前端传递的参数
(2)都是在封装类对象的前面加上注解“@Valid”
2.ConstraintViolationException与上面两个注解的使用不同
(1)是使用多个对象去一一对应表单数据
(2)是在整个Controller类上加上@Validated注解