2012-10-04 49 views
4

我玩耍和轉換的Spring MVC的REST項目中使用新澤西州,並與抓SAXNotRecognizedException

@ExceptionHandler(HttpMessageNotReadableException.class) 

註解我班的一個,這將趕上去過程中的任何異常都有一個方法XML消息的序列化。通過這種方式,我可以檢測到用戶在POST請求中發送錯誤的XML時返回XML錯誤響應,而不是400/500標準HTML錯誤頁面。

澤西島有類似的東西嗎?我試圖創建一個異常映射類

@Provider 
public class HttpMessageNotReadableException 
     implements ExceptionMapper<org.xml.sax.SAXNotRecognizedException> { 

,但似乎並沒有趕上任何前途的錯誤,只是當我拋出異常從資源類中。

因此,我認爲有我的方法獲取字符串,並做反序列化和捕捉任何錯誤:

@POST 
@Path("/product") 
public Response createProduct(String createRequest) { 
     try { 
     // de-serialize 
     // do work ... 
     } catch ... 

代替

@POST 
@Path("/product") 
public Response createProduct(CreateProduct createRequest) { 
    // do work ... 

,但似乎並不正確,只是會用相同的錯誤檢查來污染我所有的課程。

我也看了有關使用

@Provider 
class MyXmlReader implements MessageBodyReader { 

實現我自己的讀者但這似乎只是重新發明輪子,因爲JAXB已經在做反序列化,我只是想捕獲錯誤。

任何人都知道是否有更好的方法來捕捉不良的傳入XML?

+0

它應該與ExceptionMapper一起使用。你能添加你得到的異常堆棧跟蹤嗎? –

回答

2

澤西島使用與Spring(在JAX-RS中定義)完全相同的@Provider方法。我不知道Spring un/marshall對象如何,但Jersey默認使用JAXB for XML和JSON(如果您告訴它,可以使用Jackson for JSON)。

您是否試圖捕獲JAXB異常?

import javax.ws.rs.core.Response; 
import javax.ws.rs.ext.ExceptionMapper; 
import javax.ws.rs.ext.Provider; 
import javax.xml.bind.JAXBException; 

@Provider 
public class JAXBExceptionMapper implements ExceptionMapper<JAXBException> { 
    public Response toResponse(JAXBException exception) { 
     return Response.status(Status.BAD_REQUEST).build(); 
    } 
}