2013-01-07 32 views
1

我目前有一個運行Jersey的RESTful webservice。我最近添加了一個過濾器來完成一些auth的東西,並且它在happy-path的情況下工作。然而,當我需要從該過濾器中拋出,而不是序列化的異常成爲一個漂亮的JSON字符串是一個錯誤,它拋出一個500,出現以下錯誤:從篩選器拋出序列化Jersey異常錯誤

javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message 
body writer for Java class myclass, and Java type class myclass, and MIME media type 
application/octet-stream was not found 

的事情是,我不知道想要將任何內容寫入應用程序/八位字節流。我的服務只使用application/json。這在我的實際Resource類中不是問題,我可以在其中指定@Produces註釋。從資源正文拋出的錯誤響應將正確序列化。

那麼我的問題是:如何控制過濾時拋出異常時使用的MIME類型?

+0

您是否添加了「servlet過濾器」或「澤西過濾器」? – miguelcobain

回答

2

您需要構建一個異常映射程序來處理異常並將它們轉換爲JSON。例如:

@Provider 
public class UnexpectedExceptionMapper implements ExceptionMapper<Exception> 
{ 
    @Override 
    public Response toResponse(final Exception exception) 
    { 
    ResponseBuilder builder = Response.status(Status.BAD_REQUEST) 
             .entity(jsonError(exception)) 
             .type(MediaType.APPLICATION_JSON); 
    return builder.build(); 
    } 

    private String jsonError(final Exception exception) 
    { 
    return "{\"error\":\"" + exception.getMessage() + "\"}"; 
    } 
} 
+0

因此,我嘗試了exceptionmapper路由,並且我無法完成它的工作。但是,您的答案確實包含了解決方案。我遇到的問題是,我在過濾步驟中拋出的任何異常都被CXF(關於octet-stream的未知作者)轉化爲另一個異常。事實證明,我所需要做的就是在響應構建步驟(在此使用.type()調用進行)中顯式定義類型。我以前從未遇到過這種情況,因爲我的其他所有例外都是從@Produces可用的地方拋出的。 – galactoise