问题描述
我在 Spring Boot Framework(版本 2.2.6.RELEASE 和 2.3.4)中使用 javax.validation api 来验证控制器方法参数中的 java bean。我在验证参数后立即添加了一个绑定结果,并尝试收集 Binding Result
字段提供的信息,旨在将我返回的数据自定义到前端。但是,这不起作用并且错误(或java中的异常仍然被抛出,因此我在方法中的语句没有被调用)。 Controllers中的示例方法和控制台中的结果,以及返回给前端的JSON数据如下所示:
//R is my customized info class carrying data that I want to sent to the //front-end
public R save(@Valid @RequestBody BrandEntity brand,BindingResult result){
if (result.hasErrors()) {
Map<String,String> map = new HashMap<>();
result.getFieldErrors().forEach(item->{
map.put(item.getField(),item.getDefaultMessage());
});
return R.error(400,"提交的数据不合法" ).put("data",map);
}
brandService.save(brand);
return R.ok();
}
控制台日志:
2021-03-05 00:31:46.316 ERROR 29422 --- [io-10000-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing Failed; nested exception is javax.validation.ConstraintViolationException: save.brand.showStatus: 必须是正数,save.brand.name: 不能为空] with root cause
javax.validation.ConstraintViolationException: save.brand.showStatus: 必须是正数,save.brand.name: 不能为空
at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:117) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749) ~[spring-aop-5.2.5.RELEASE.jar:5.2.5.RELEASE]
...
at org.apache.tomcat.util.net.socketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) ~[na:na]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.33.jar:9.0.33]
at java.base/java.lang.Thread.run(Thread.java:834) ~[na:na]
返回给前端的JSON数据是这样的:
{
"timestamp": "2021-03-04T16:31:46.319+0000","status": 500,"error": "Internal Server Error","message": "save.brand.showStatus: 必须是正数,save.brand.name: 不能为空","path": "/product/brand/save"
}
由 Spring Boot Framework 中的默认异常处理程序处理。 这意味着方法中的语句根本不执行。
我知道带有 @ContollerAdvice
注释的处理 ConstraintViolationException 的类可以解决这个问题。但我想知道为什么 BindingResult 参数不起作用并且该异常仍然通过 save() 方法抛出? (请忽略中文留言,如果您愿意,可以更正我的英文--谢谢)
---------编辑---------
一个可能的线索:
@RequestParam ---> javax.validation.ConstraintViolationException
@RequestBody 上验证 ---> MethodArgumentNotValidException
---------解决了吗?-----
我应该使用 @Validated
而不是 @Valid
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)