转载自:
https://blog.csdn.net/qq_31142553/article/details/89430100
推荐我的另一篇博文:《
利用Aspect/Javassist/动态代理/Lombok等方式省略Controller的参数校验结果处理代码
》
Validation的注解就不介绍了,大家可以去看源码包或者网上找相关资料。
这里直接说执行校验的3种方式。本文使用的参数注解情况以及请求的参数值如下
* 用户类
*
@author
z_hh
* @time 2019年4月21日
@Data
public
class
User {
/**
id
*/
@NotNull(message
="id不能为空"
)
private
Long id;
/**
姓名
*/
@NotBlank(message
="姓名不能为空"
)
private
String name;
/**
年龄
*/
@NotNull(message
="年龄不能为空"
)
@Max(message
="年龄不能超过120岁", value = 120
)
@Min(message
="年龄不能小于1岁", value = 1
)
private
Integer age;
/**
创建时间
*/
@Future
private
Date createTime;
"id": 12
,
"name": ""
,
"age": 0
,
"createTime": "2018-12-31"
第一种:在Controller方法参数前加@Valid注解——校验不通过时直接抛异常
* 校验不通过时直接抛异常
*
@param
user
*
@return
@PostMapping("/test1"
)
public
Object test1(@RequestBody @Valid User user) {
return
"操作成功!"
;
1 调用时会抛出一个org.springframework.web.bind.MethodArgumentNotValidException异常:
3 2019-04-21 11:35:28.600 WARN 10852 --- [nio-8080-exec-4] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public java.lang.Object com.example.validation.UserController.test1(com.example.validation.User) with 3 errors: [Field error in object 'user' on field 'createTime': rejected value [Mon Dec 31 08:00:00 CST 2018]; codes [Future.user.createTime,Future.createTime,Future.java.util.Date,Future]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.createTime,createTime]; arguments []; default message [createTime]]; default message [需要是一个将来的时间]] [Field error in object 'user' on field 'age': rejected value [0]; codes [Min.user.age,Min.age,Min.java.lang.Integer,Min]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.age,age]; arguments []; default message [age],1]; default message [年龄不能小于1岁]] [Field error in object 'user' on field 'name': rejected value []; codes [NotBlank.user.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.name,name]; arguments []; default message [name]]; default message [姓名不能为空]] ]
★★★使用这种的话一般结合统一异常处理器(或者Aspect、拦截器等)处理★★★
第二种:在Controller方法参数前加@Valid注解,参数后面定义一个BindingResult类型参数——执行时会将校验结果放进bindingResult里面,用户自行判断并处理
* 将校验结果放进BindingResult里面,用户自行判断并处理
*
@param
user
*
@param
bindingResult
*
@return
@PostMapping("/test2"
)
public
Object test2(@RequestBody @Valid User user, BindingResult bindingResult) {
//
参数校验
if
(bindingResult.hasErrors()) {
String messages
=
bindingResult.getAllErrors()
.stream()
.map(ObjectError::getDefaultMessage)
.reduce((m1, m2)
-> m1 + ";" +
m2)
.orElse(
"参数输入有误!"
);
throw
new
IllegalArgumentException(messages);
return
"操作成功!"
;
第三种:用户手动调用对应API执行校验——Validation.buildDefault ValidatorFactory().getValidator().validate(xxx)
* 用户手动调用对应API执行校验
*
@param
user
*
@return
@PostMapping("/test3"
)
public
Object test3(@RequestBody User user) {
//
参数校验
validate(user);
return
"操作成功!"
;
private
void
validate(@Valid User user) {
Set
<ConstraintViolation<@Valid User>> validateSet =
Validation.buildDefaultValidatorFactory()
.getValidator()
.validate(user,
new
Class[0
]);
if
(!
CollectionUtils.isEmpty(validateSet)) {
String messages
=
validateSet.stream()
.map(ConstraintViolation::getMessage)
.reduce((m1, m2)
-> m1 + ";" +
m2)
.orElse(
"参数输入有误!"
);
throw
new
IllegalArgumentException(messages);