入参校验:@Valid&@Validated&MethodArgumentNotValidException&BindException&ConstraintViolationException

在入参校验异常部分可能会抛出三种异常:

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.MethodArgumentNotValidExceptionBindException的子类,这两个异常类是同一族的,因此使用上有共同点
(1)都是以“封装类对象”去接收前端传递的参数
(2)都是在封装类对象的前面加上注解“@Valid”
2.ConstraintViolationException与上面两个注解的使用不同
(1)是使用多个对象去一一对应表单数据
(2)是在整个Controller类上加上@Validated注解
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值