Springframework:constraintviolationexception still 即使我在@valid annotated变量后面添加了bindingresult,也会被抛出

xdnvmnnf  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(217)

我正在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()方法抛出异常(请忽略中文留言,如果您愿意的话,可以修改我的英文--谢谢)
---------编辑

e0bqpujr

e0bqpujr1#

一个可能的线索:
@requestparam--->javax.validation.constraintviolationexception异常
@请求主体上验证--->methodargumentnotvalidexception
---------解决了吗-----
我应该用 @Validated 而不是 @Valid .

相关问题