2012-04-08 154 views
7

我試圖處理來自後端的錯誤。如果發生錯誤但內容是XmlMessage的實例,則調用handleMessage()。我想將其更改爲我自己的回覆 - 只需設置響應代碼並添加一些消息即可。使用CXF攔截器處理錯誤 - 更改響應消息

我還沒有發現任何適當的文件,其能告訴我如何做到這一點?

這些axamples是REST,但我想在SOAP來管理這件事情了。

攔截

public class ErrorHandlerInterceptor extends AbstractPhaseInterceptor<Message> { 

    public ErrorHandlerInterceptor() { 
     super(Phase.POST_LOGICAL); 
    } 

    @Override 
    public void handleMessage(Message message) throws Fault { 
     Response response = Response 
      .status(Response.Status.BAD_REQUEST) 
      .entity("HOW TO GET A MESSAGE FROM AN EXCEPTION IN HERE???") 
      .build(); 
     message.getExchange().put(Response.class, response); 
    } 

} 

的context.xml

<bean id="errorHandlerInterceptor" 
    class="cz.cvut.fit.wst.server.interceptor.ErrorHandlerInterceptor" /> 

<jaxrs:server address="/rest/"> 
    <jaxrs:serviceBeans> 
     <ref bean="restService" /> 
    </jaxrs:serviceBeans> 
    <jaxrs:outFaultInterceptors> 
     <ref bean="errorHandlerInterceptor" /> 
    </jaxrs:outFaultInterceptors> 
</jaxrs:server> 

回答

5

而這裏的the other piece of your puzzle。你已經在使用JAX-RS,那麼爲什麼不使用JAX-WS呢?

This thread and this blog post封面映射例外到SOAP錯誤。短和甜:

,例外與@WebFault註釋必須有兩個構造函數和一個方法[吸氣劑,以獲得故障信息]的JAX-WS 2.0規範要求:

WrapperException(String message, FaultBean faultInfo) 
WrapperException(String message, FaultBean faultInfo, Throwable cause) 
FaultBean getFaultInfo() 

的WrapperException被替換由異常的名稱,FaultBean由實現錯誤bean的類名替換。故障bean是一個Java bean,它包含故障信息,並由Web服務客戶端用來了解故障原因。

還有你的映射。只需在@WebFault的上下文中指定上述簽名的實現,並且您的SOAP API應該愉快地映射這些簽名。顯然,鏈接包含更多細節。

+0

謝謝。我不接受你的回答,爲了分享你們之間的聲望 – user219882 2012-04-15 22:18:48

+0

@Tomas雖然努力是高尚的(我很高興我幫了忙!),不幸的是,[這不是賞金系統的工作原理]( http://meta.stackexchange.com/questions/2786/accept-multiple-answers-or-split-bounty-among-several-users)([details](http://meta.stackexchange.com/questions/16065) /如何 - 做最賞金系統工作/ 16067#16067))。我爲你調和這件事感到不自在,因爲我對結果有一定的興趣,但是如果你覺得有兩個答案是值得的,則可以選擇授予額外的獎勵。抱歉,添麻煩了;我沒有寫這個系統。 :) – MrGomez 2012-04-15 22:31:55

+0

哦,那太糟糕了。我決定這樣做:我給予mjwenk賞金,因爲聲望可以幫助他比你更多並接受你的答案,因爲你有鏈接到REST和SOAP。我想這是唯一公平的方式(或者至少是一點點)。謝謝你提到它... – user219882 2012-04-16 00:06:34

13

如果您使用JAX-RS,爲什麼不設置一個例外映射器,然後使用該映射程序來處理響應。

一個簡單的例子:

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class MyExceptionMapper implements 
     ExceptionMapper<MyException> { 

    @Override 
    public Response toResponse(MyException e) { 
     return Response.status(Status.NOT_FOUND).build(); 
    } 

} 

那麼你就需要通過增加註冊在JAXRS服務提供商:

<jaxrs:providers> 
    <bean class="com.blah.blah.blah.blah.MyExceptionMapper"/> 
</jaxrs:providers> 
在上下文中的服務器配置

。有了這個,你可以完全訪問這個例外,並且可以從它得到你想要的任何東西。

+0

如果我想使用SOAP呢?我該如何處理?與JAX-RS相同,還是我必須攔截? – user219882 2012-04-10 22:26:12

+0

對於肥皂,我認爲你必須使用攔截器。我從來沒有能夠弄清楚我需要做什麼才能在CXF的肥皂工作。幸運的是,對我來說這不是什麼大問題,但是jax-rs的方式似乎更好。 – mjwenk 2012-04-10 23:37:03

+0

如果我有以下情況,該怎麼辦?我有一個執行驗證的攔截器。我也有一個異常處理程序。如果我想從攔截器中拋出我的自定義異常,我的異常處理程序的toResponse方法是否會被調用? – Bhuvan 2013-06-13 04:45:17