【问题标题】:Data Binding Error Handling in Spring MVCSpring MVC 中的数据绑定错误处理
【发布时间】:2012-07-28 15:45:00
【问题描述】:

我有一个关于 Spring MVC 中的数据绑定的问题。

我有一个控制器,它接受 @RequestBody 形式的 JSON 请求。我已经完成了所有 JSR 303 验证,而且效果非常好。

  • JSON 请求

    public class TestJSONRequest {
    
        @Size(min=10,message="{invalid.demo.size}")
        String demo;
    
        int code;
    }
    
  • 控制器

    @Controller
    @RequestMapping("/test")
    public class TestController {
    
        public void testEntry(@RequestBody TestJSONRequest jsonRequest,ModelMap map)
    
          Set<ConstraintViolation<TestJSONRequest>> violationList = validator.val(jsonRequest);
          ....
          ....
          TestJSONResponse response = // Do complex Logic.
          modelMap.addattribute("TestJSONResponse",response);
        }
    }
    

但是一旦传入的 JSON 数据绑定到 Request 对象,JSR 303 验证就会启动。

如果我在输入 JSON 请求的 code 字段中发送 ab,绑定本身就会失败。

我该如何处理?

我想捕捉那些数据绑定错误并在我的控制器中进行某种通用错误处理。

你能帮我解决这个问题吗?

P.S - 我使用的是 Spring 3.0.3

【问题讨论】:

    标签: java spring jakarta-ee spring-mvc spring-webflow


    【解决方案1】:

    根据当前Spring documentation (V3.1)

    与 @ModelAttribute 参数不同,BindingResult 可用于检查错误,@RequestBody 验证错误总是导致引发 MethodArgumentNotValidException。异常在 DefaultHandlerExceptionResolver 中处理,它将 400 错误发送回客户端。

    现在您可以通过创建一个新方法来告诉 Spring 您想要处理这个问题,如下所示:

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public String handleValidation(MethodArgumentNotValidException e, ModelMap map) {
        List<ObjectError> errors = e.getBindingResult() .getAllErrors();
        // your code here...
        return "path/to/your/view";
    }
    

    最后,阅读 @ExceptionHandler 的 Spring 文档。那里很可能有一些有用的信息。

    【讨论】:

    • 感谢您的信息。我正在使用 Spring 3.0.3 .. MethodArgumentNotValidException 仅在 v3.1 中可用我想.. 我将无法更改 spring 版本,因为在 mvc 开发之上有一个不受我控制的框架..另外,在我的控制器中,我没有这样给出视图名称。我只是在模型映射中设置属性,前端模板会读取映射以获取必要的信息。使用@ExceptionHandler 注解的方法的返回类型是否应该始终是 String ?
    • 它可以是StringModelAndView,或者您可以执行诸如返回Map 之类的操作,并使用@RequestMapping(produces="application/json")@ResponseBody 将其转换为JSON。
    • 哦,好吧...但我不喜欢 Spring 3.1。所以,我将无法使用 MethodArgumentNotValidException。有什么办法可以解决绑定问题吗?
    • 如果绑定失败,您也许可以为TestJSONRequest 创建自己的活页夹。看看@InitBinder。与 Spring 一样,您将能够获得解决方案,但挑战在于在 Spring 框架中找到正确的入口点!有时需要进行一些调试。
    • 我不确定如何通过 InitBinder 实现这一点......我们是否应该为输入 JSON 请求中使用的每种类型编写自定义编辑器类......还有其他有效的方法吗?当绑定失败时,它会抛出 org.codehaus.JSonMappingException。我试图在使用 @ExceptionHandler 注释的方法中获取此异常,但控件从未出现在该方法中...
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2017-12-18
    • 1970-01-01
    • 2011-12-31
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多