我正在SpringBootFramework(版本2.2.6.release和2.3.4)中使用javax.validation api来验证控制器方法参数中的JavaBean。我在验证参数之后添加了一个绑定结果,并尝试收集 Binding Result
现场补给,目的是将我返回的数据定制到前端。但是,这不起作用,并且错误(或者java中的异常仍然被抛出,因此我在方法中的语句不会被调用)。控制器中的示例方法和控制台中的结果以及返回到前端的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引导框架中的默认异常处理程序处理。这意味着方法中的语句根本不执行。
我知道一节课 @ContollerAdvice
处理constraintviolationexception的annotated可以解决这个问题。但是我想知道为什么bindingresult参数不起作用,并且仍然通过save()方法抛出异常(请忽略中文留言,如果您愿意的话,可以修改我的英文--谢谢)
---------编辑
1条答案
按热度按时间e0bqpujr1#
一个可能的线索:
@requestparam--->javax.validation.constraintviolationexception异常
@请求主体上验证--->methodargumentnotvalidexception
---------解决了吗-----
我应该用
@Validated
而不是@Valid
.