2012-10-04 37 views
0

我有一臺服務器將一組類作爲RESTful服務公開。我知道我們可以使用ExceptionMapper將異常傳遞給客戶端。客戶端和服務器之間共享的檢查異常很少。但是在我的一些服務中,我有幾個檢查異常,這些異常在客戶端JVM中不可用。JAX RS CXF Interceptor用於引發客戶端特定異常

我知道,更改端點以確保正確處理checked-exception可以解決問題。

但是,我想做到這一點,在攔截器層,原因有二:

  • 這將是一個地方,我可以處理所有導致檢查的異常的調用。
  • 由於目前的發佈日期,這將是一個很大的重構工作。在CXF documentation

看,我明白我必須擴展AbstractPhaseInterceptor並覆蓋handleMessage()

public class MyOutExceptionInterceptor extends AbstractPhaseInterceptor<Message> { 

    public AttachmentInInterceptor() { 
     //Which phase to call here ?? 
     super(Phase.POST_INVOKE); 
    } 

    public void handleMessage(Message message) { 

     //Check from message that it contains an exception of MyCheckedException.class 
     //Create an exception that client can understand 

    } 
} 

我該怎麼辦呢?

在此先感謝。

回答

0

嘗試是這樣的:(我省略了製圖/在detaisl填充爲簡潔;關鍵的事情做的是替換郵件內容)

public void handleMessage(Message message) { 
// Map exception 
    Exception exception = message.getContent(Exception.class); 
    Exception mappedException = mapper.map(exception); 

    Fault fault = exception instanceof Fault ? (Fault) exception : null; 
    if (fault == null) 
    { 
     fault = new Fault(exception); 
     message.setContent(Exception.class, fault); 
    } 
    fillInFaultDetails(fault, exception); 
} 

這實際上是從我們的代碼片段。至於階段 - 我們在POST_LOGICAL運行它; POST_INVOKE也可以工作。

順便說一句 - 不知道什麼是你的使用情況,但我不喜歡使用故障通信業務異常(在我的腦海故障指示一般的消息處理錯誤,而不是一個業務邏輯異常

+0

感謝您的回覆。但是,我在'fault = new Fault(exception)'中得到了一個RuntimeException;'在帶有此代碼的鏈式攔截器中。 – Chris

+0

這是什麼樣的例外? – mucher

1

我。知道我來晚了,但我也有這個問題,這種解決方案提出了這樣以供將來參考:

覆蓋handleFault代替,裏面:

Exception fault = message.getContent(Exception.class); 
Exception exception = fault.getCause(); 
YourOwnFault newFault = new YourOwnFault("bla bla bla"); 
message.setContent(Exception.class, newFault); 

換句話說,提取故障,拿到作爲原因的異常,創造e新的錯誤並插入int。

+0

你沒有使用'exception'變量。你爲什麼這麼做? –

+0

可能在YourOwnFault的構造函數中使用它,而不是「bla bla bla bla」。 – Gunslinger