2013-01-21 87 views
0

我開發與JAX-RS /阿帕奇CXFJSON通過@WebFault註釋

我想的Apache CXF到客戶端 - 服務器應用程序映射在JAX-RS的自定義異常在兩端透明地處理我的異常:這意味着將異常轉換爲一個bean,用我的Jackson串行器(JSON)序列化它,然後在客戶端進行過濾。

我已經看到了關於這個問題的一些令人困惑的帖子/解答和使用@WebFault註解上來:

@WebFault(name=CODE, faultBean="foo.bar.FaultBean") 
public class DuplicateRuleNameFault extends Exception { 
    static final public String CODE = "DUPLICATE_RULE_NAME"; 
    private FaultBean faultBean; 

    public DuplicateRuleNameFault(String msg) { 
    super(msg); 
    this.faultBean = new FaultBean(msg); 
    } 
    public DuplicateRuleNameFault() { 
    } 
    public FaultBean getFaultBean() { 
    return faultBean; 
    } 
    public void setFaultBean(FaultBean faultBean) { 
    this.faultBean = faultBean; 
    } 
} 

沒有成功。目前,CXF似乎高興地忽視異常的註解並將其作爲未知異常處理:在服務器端生成500個狀態錯誤和沒有響應主體。

在我的Spring上下文的「」服務器元素中是否有特定的東西需要配置?我已經有Spring掃描我的Exception/FaultBean類(它甚至需要BTW?)。

如果你能指點我一些工作的例子,我將不勝感激。 謝謝。

+0

可以請你分享你是怎麼做到的解決方案...我面臨着同樣的問題:( – vashishth

+0

我們切換到「功能異常」: 我們有cserver側的異常映射器,在建立自定義的JSON一個例外。 然後,在客戶端,我使用inInterceptor解組JSON並拋出一個異常,它對應於一個錯誤。 –

回答

3

@WebFault's不是JAX-RS規範的一部分。您將需要閱讀規範的section 3.3.4,其中描述了您可以完成您嘗試執行的不同方式。

選項1

設計你的資源類扔WebApplicationException's。將這些異常的response屬性設置爲包含要發送給客戶端的錯誤bean的有效JAX-RS響應。

選項2

定義異常映射供應商。您可以創建這些的層次結構來處理應用程序將拋出的所有常見異常。或者,您可以使用嵌入式Bean和它的異常處理程序創建頂級異常。然後從頂級的例子中推導出幾個特定的​​例外。

public abstract class MyApplicationException<T> extends Exception { 
    private T faultBean; 

    // Constructors, setters/getters 
} 

@Provider 
public class MyApplicationExceptionHandler implements ExceptionMapper<MyApplicationException<?>> { 
    // Implementation 
} 
+0

謝謝。 我ifnally做到這一點,SS上有一個ExceptionMaopper,客戶端有一個ResponseExceptionMapper。 –

0

這樣做的一種方式是通過使用所述對象javax.ws.rs.core.Response像這樣:

@GET

@Path( 「/」)

公共響應getBlah ()

{

try { 
    return Response.status(Response.Status.OK) 
      .entity(<Object you want to return>).build(); 
} 
catch (final DuplicateRuleNameFault e) { 
    return Response.status(Response.Status.BAD_REQUEST) 
      .entity(e.getFaultBean().getMsg()).build(); 
} 

}

+0

當然,但這樣我也必須在客戶端手動解析異常。 我想借鑑JAX-RS和CXF的優勢,允許通過在一行代碼中包裝服務定義來動態實例化客戶端。 –