2012-07-30 103 views
3

我对Spring MVC中的数据绑定有疑问。Spring MVC中的数据绑定错误处理

我有一个Controller,它以@RequestBody的形式接受一个JSON请求。我拥有所有的JSR 303验证,并且它像一个魅力。一旦进入JSON数据被绑定到请求对象

  • 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); 
        } 
    } 
    

但是JSR 303的验证之后英寸

如果我发送ab代码字段的输入JSON请求,绑定本身会失败。

我该如何处理?

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

你能帮我解决吗?

PS - 我使用Spring 3.0.3

回答

3

根据目前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"; 
} 

最后,有春的文档WRT @ExceptionHandler的读取。那里最有可能有一些有用的信息。

+0

感谢您的信息。我正在使用Spring 3.0.3 .. MethodArgumentNotValidException仅在v3.1中可用我想..我将无法更改弹簧版本,因为在mvc开发之上有一个框架不在我的控制之中。另外,在我的控制器中,我不会给出视图名称。我只是在模型地图中设置属性,前端模板读取地图以获取必要的信息。用@ExceptionHandler注解的返回类型的方法应该总是一个String? – user1166031 2012-07-31 00:17:06

+0

它可以是一个String或者ModelAndView,或者你可以像返回一个Map一样使用'@RequestMapping(produce =“application/json”)''和'@ ResponseBody'将它转换为JSON。 。 – Muel 2012-07-31 00:23:23

+0

哦,好的...但我不喜欢Spring 3.1。所以,我不能使用MethodArgumentNotValidException。有什么我可以做的,以捕捉有约束力的问题? – user1166031 2012-07-31 00:25:16