2016-12-05 52 views
3

我有一个REST API方法:它将返回Xml作为响应。只是为了简单,假设它抛出简单的异常。Spring mvc - 为XML和JSON响应配置错误处理

@RequestMapping(value = "machine/xmlData", method = RequestMethod.GET, produces = "application/xml") 
    public ResponseEntity<String> getXml(HttpServletRequest request) 
      throws Exception { 
     return getDataFromService(); 

} 

现在我正在处理像这样的REST控制器中的异常。 这是一般异常handle方法,对于其他API方法以及(XML或JSON响应)

@ExceptionHandler(Exception.class) 
     @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) 
     public ResponseEntity HandleException(Exception ex, HttpServletRequest request) { 
      ex.printStackTrace(); 
      // here logic to generate Custom error Object 
      return new ResponseEntity<Object>(customErrorObject, HttpStatus.INTERNAL_SERVER_ERROR); 
     } 

案例1:接受: “应用程序/ XML”,并从服务有效响应 一切工作正常。

案例2:接受:从服务 “应用程序/ XML” 和异常然后我得到406 Not Representable

按我的理解,它是

因为ResponseEntity从HandleException是JSON和接受标头 是“应用程序/ xml”,这就是为什么我越来越406.

无论如何,我可以发送错误HandleException方法的响应xml和json? 我知道关于REST API方法,我们可以定义像这样的produces={"application/json","application/xml"}我很努力把这个放在HandleException方法上。

任何提示将有很大的帮助。

谢谢。

+0

删除handleResult中的@ResponseStatus并尝试 – kuhajeyan

+0

@kuhajeyan它没有帮助。我试过 – Roxy

回答

1

您可以通过使用@ResponseBody注释(https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc)利用spring-mvc HttpMessageConverters。此注释负责为给定响应类型选择正确的messageConverter。

您的答复是XML或JSON兼容,你需要做到以下几点:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class WrappedExceptionResponse { 
    public String respone; 

    public String getRespone() { 
     return respone; 
    } 

    public void setRespone(String respone) { 
     this.respone = respone; 
    } 
} 

,改变你的异常处理方法

@ExceptionHandler(Exception.class) 
    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) 
    public @ResponseBody WrappedExceptionResponse HandleException(Exception ex, HttpServletRequest request) { 
//  ex.printStackTrace(); 
     // here logic to generate Custom error Object 
     WrappedExceptionResponse resp=new WrappedExceptionResponse(); 
     resp.setRespone(ex.getMessage()); 
    return resp; 

然后你的异常反应是依赖于您提供的内容类型。

+0

但它的静态,我不能用它的JSON MediaTypes。我想要有一些通用错误响应。 – Roxy

+1

Eddited我的答案,请检查它是否符合预期的JSON和XML。 –

+0

它没有帮助。 @ResponseBody不会自动使用正确的转换器。 – Roxy