2016-12-05 51 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