2013-04-25 59 views
2

我創建了一個自定義異常,我有一個異常映射器,當我的異常被拋出時我想被調用,這樣我可以返回正確的http返回碼和消息,但由於某種原因它對我的例外不起作用。Cxf異常映射器沒有被調用

下面是相關代碼

我的異常類:

public class MyException extends ApplicationRuntimeException 
{ 

    private static final long serialVersionUID = 1L; 

    public MyException() 
    { 
     super(); 
    } 

    public MyException (String message) 
    { 
     super(message); 
    } 

    public MyException (String message, ErrorCode errorCode) 
    { 
     super(message, errorCode); 
    } 

    public MyException (Throwable t) 
    { 
     super(t); 
    } 

    public MyException (String message, Throwable t) 
    { 
     super(message, t); 
    } 

} 

我的異常映射類

@Provider 
public class MyExceptionMapper implements ExceptionMapper<Exception> 
{ 
    @Override 
    public Response toResponse(Exception exception) 
    { 
     //code 
     return response; 
    } 
} 

CXF-配置

<jaxrs:server id="serviceId" address="/"> 
     <jaxrs:providers> 
      <bean class="com.package.MyExceptionMapper"/> 
     </jaxrs:providers> 
</jaxrs:server> 

實際上,這就是我的代碼就像,有什麼我失蹤或任何其他信息,我需要提供以解決這個問題?

異常和異常映射程序位於兩個不同的項目中,但我認爲這不重要,因爲它們都在類路徑中。

感謝

+0

你是否檢查MyException中的toResponse()方法是否被執行? – 2013-04-25 04:46:24

+0

toResponse()方法從未得到執行。 – user1751547 2013-04-25 14:16:32

回答

5

如果這是你的全CXF,你缺少在這個服務器中的服務豆執行。

提供程序綁定到該服務,並且只會執行服務bean中定義的服務。

除了一切看起來不錯,我會檢查並確保你的異常真的被拋出。

+0

我的確定義了一個serviceBean,並且我發現當在服務bean之外拋出異常時,異常映射器不會被調用,而如果它被引發到bean中,它將被調用。我如何改變它,以便總是調用異常映射器? – user1751547 2013-04-25 16:12:30

+0

爲了擴展我的最後一條評論,異常映射器沒有被調用的異常從 bean中拋出 – user1751547 2013-04-25 16:25:42

+0

不知道我明白你在做什麼。你有一個serviceBean,它在方法上有一個@POST註釋。該方法拋出了MyException類型的異常。您已經編寫了一個ExceptionMapper來將該異常轉換爲特定的響應。這是ExceptionMapper專用的用例。您爲部署服務Bean的jaxws服務器編寫Provider(ExceptionMapper)。攔截器框架處於不同的操作級別,具體取決於它的類型。你從未提及過其他的攔截器,所以請提供你在做什麼的全部範圍? – fpmoles 2013-04-25 18:40:20

0

異常映射程序只處理由服務bean拋出的異常。

這種情況下的一個選擇是拋出一個新的WebApplicationException(Throwable,Response),其中響應的構建方式應與異常映射程序中所做的相同。

如果你正在嘗試做一些驗證,我認爲創建自定義消息體讀取器是一個不錯的選擇。通過這樣做,在郵件正文閱讀器中,您還可以訪問其他提供者/異常映射器。

祝你好運!