2011-02-09 42 views
6

代码是这样的:的ExceptionHandler返回JSON或XML Spring MVC中不工作3

@Controller 
    public class TestController { 

     @RequestMapping(value = "/testerror", method = RequestMethod.GET) 
     public @ResponseBody ErrorTO testerror(HttpServletRequest request,HttpServletResponse response) { 
      throw new ABCException("serious error!"); 
     } 


     @ExceptionHandler(ABCException.class) 
     public @ResponseBody ErrorTO handleException(ABCException ex, 
       HttpServletRequest request, HttpServletResponse response) { 
      response.setStatus(response.SC_BAD_REQUEST); 
      return new ErrorTO(ex.getMessage()); 
     } 


    @RequestMapping(value = "/test", method = RequestMethod.GET) 
    public @ResponseBody ErrorTO test(HttpServletRequest request, 
             HttpServletResponse response) { 
     ErrorTO error = new ErrorTO(); 
     error.setCode(-12345); 
     error.setMessage("this is a test error."); 
     return error; 
    } 

} 

,当我试图卷曲-H “接受:应用/ JSON的” -v“http://localhost.com: 8080/testerror“ 我得到这个错误: org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver - 找不到支持返回类型的HttpMessageConverter [class com.kibboko.poprocks.appservices.dtos.ErrorTO]和[application/json]

但如果我尝试curl -H“Accept:application/json”-v“http://localhost.com:8080/test”,工作和返回json响应。 “application/xml”也起作用。

是否有什么特殊的异常处理程序我需要照顾,所以它可以使用json或xml?谢谢!

回答

7

看起来AnnotationMethodHandlerExceptionResolver有它自己的HttpMessageConverter s阵列。您需要将其配置为使用AnnotationMethodHandlerAdapter所使用的相同阵列。

然而,当隐含地声明AnnotationMethodHandlerAdapter时,它可能变得复杂。也许在声明下面FactoryBean在所有情况下可能会有帮助:

public class AnnotationMethodHandlerExceptionResolverFactoryBean 
     implements FactoryBean<AnnotationMethodHandlerExceptionResolver> { 
    @Autowired 
    private AnnotationMethodHandlerAdapter a; 

    public AnnotationMethodHandlerExceptionResolver getObject() 
      throws Exception { 
     AnnotationMethodHandlerExceptionResolver r = new AnnotationMethodHandlerExceptionResolver(); 
     r.setMessageConverters(a.getMessageConverters()); 
     return r; 
    } 

    ... 
} 
+0

那可真是一件麻烦事。是否有可能找到更简单的解决方案?你能给我一个工作的例子吗? – Bobo 2011-02-10 14:40:22