SpringValidation的3种执行校验方式

更新时间:2023-05-12 10:05:12 阅读: 评论:0

SpringValidation的3种执⾏校验⽅式推荐我的另⼀篇博⽂:《》。
Validation的注解就不介绍了,⼤家可以去看源码包或者⽹上找相关资料。
这⾥直接说执⾏校验的3种⽅式。本⽂使⽤的参数注解情况以及请求的参数值如下
/**
*  ⽤户类
* @author z_hh
* @time 2019年4⽉21⽇
*/
@Data
public class Ur {
/** 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 ur
* @return
*/
@PostMapping("/test1")
public Object test1(@RequestBody @Valid Ur ur) {
return "操作成功!";
}
调⽤时会抛出⼀个org.springframework.web.bind.MethodArgumentNotValidException异常:
2019-04-21 11:35:28.600  WARN 10852 --- [nio-8080-exec-4] .s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public
java.lang.ample.ample.validation.Ur) with 3 errors: [Field error in object 'ur' on field 'createTime': rejected value [Mon Dec 31 08:00:00 CST 2018]; codes
[ateTime,Future.java.util.Date,Future]; arguments
[t.support.DefaultMessageSourceResolvable: codes [ur.createTime,createTime]; arguments []; default message [createTime]]; default message [需要是⼀个将来的时间]] [Field error in object 'ur' on field 'age': rejected value [0]; codes [Min.ur.age,Min.age,Min.java.lang.Integer,Min]; arguments
[t.support.DefaultMessageSourceResolvable: codes [ur.age,age]; arguments []; default message [age],1]; default message [年龄不能⼩于1岁]] [Field error in object 'ur' on field 'name': rejected value []; codes [NotBlank.ur.name,NotBlank.name,NotBlank.java.lang.String,NotBlank]; arguments
[t.support.DefaultMessageSourceResolvable: codes [ur.name,name]; arguments []; default message [name]]; default message [姓名不能为空]] ]
★★★使⽤这种的话⼀般结合统⼀异常处理器(或者Aspect、拦截器等)处理★★★
第⼆种:在Controller⽅法参数前加@Valid注解,参数后⾯定义⼀个BindingResult类型参数——执⾏时会将校验结果放进bindingResult⾥⾯,⽤户⾃⾏判断并处理
/**
* 将校验结果放进BindingResult⾥⾯,⽤户⾃⾏判断并处理
* @param ur
* @param bindingResult
* @return
*/
@PostMapping("/test2")
public Object test2(@RequestBody @Valid Ur ur, BindingResult bindingResult) {
// 参数校验
if (bindingResult.hasErrors()) {
String messages = AllErrors()
.stream()
.
map(ObjectError::getDefaultMessage)
.reduce((m1, m2) -> m1 + ";" + m2)
.orEl("参数输⼊有误!");
throw new IllegalArgumentException(messages);
}
return "操作成功!";
}
第三种:⽤户⼿动调⽤对应API执⾏校验——Validation.buildDefault ValidatorFactory().getValidator().validate(xxx)
/**
* ⽤户⼿动调⽤对应API执⾏校验
* @param ur
* @return
*/
@PostMapping("/test3")
public Object test3(@RequestBody Ur ur) {
// 参数校验
validate(ur);
return "操作成功!";
}
private void validate(@Valid Ur ur) {
Set<ConstraintViolation<@Valid Ur>> validateSet = Validation.buildDefaultValidatorFactory()
.getValidator()
.validate(ur, new Class[0]);
if (!CollectionUtils.isEmpty(validateSet)) {
String messages = validateSet.stream()
.map(ConstraintViolation::getMessage)
.reduce((m1, m2) -> m1 + ";" + m2)
.orEl("参数输⼊有误!");
throw new IllegalArgumentException(messages);
}
}
喜欢使⽤哪⼀种看你喜欢咯?

本文发布于:2023-05-12 10:05:12,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/105558.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:参数   校验   注解   不能   处理   上找
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图