Spring 框架:ConstraintViolationException 仍然被抛出,即使我在 @Valid 注释变量

问题描述

我在 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 (将#修改为@)