2014-01-22 44 views
1

我有一個例外,我從服務器端拋出,希望在客戶端捕獲它。應使用Jersey通過REST發送異常。這是我到目前爲止有:客戶端上的Catch Rest例外

定義我的例外:

public class MyException extends Exception implements Serializable { 

    private static final long serialVersionUID = 1L; 

    public MyException() { 
     super(); 
    } 
    public MyException (String msg) { 
     super(msg); 
    } 
    public MyException (String msg, Exception e) { 
     super(msg, e); 
    } 
} 

定義我的例外,在它實現了ExceptionMapper類:

@Provider 
public class TestMapper implements ExceptionMapper<MyException> { 

    @Override 
    public Response toResponse(MyExceptionexception){ 
     return Response.status(Status.BAD_REQUEST).entity(exception.getMessage()).build(); 
    } 
} 

這是我的資源類,其中請求從服務器進入:

@PUT 
@Path("calculate") 
public void calculateMethod(String id) throws MyException{ 
    //Other code... 
    throw new MyException("custom error message string"); 
    }  
} 

最後,從客戶端使RES牛逼電話如下:

public void calculateMethodClient(String id) throws MyException{ 
    client().put("/test/", "calculate", id); 
} 

當此客戶端方法被調用,我已經和try/catch語句包圍測試:

public boolean testClient(){ 
    try { 
     client.calculateMethodClient((String) id); 
     return true; 
    } catch (MyException) { 
     return false; 
    } catch (UniformInterfaceException e){ 
     return false; 
    } 
} 

我已經把斷點在兩個catch塊,但它永遠只能打UniformInterfaceException捕獲。這不是我想要的,因爲服務器端可能出於各種原因而失敗,我希望能夠每次在'MyException'中定義錯誤消息。

有人請解釋我如何才能使這個工作?

回答

0

您需要檢查客戶端的狀態碼,如果它的請求不正確,那麼將拋出異常以及從服務器獲得的異常消息。

+0

狀態碼始終會回到500,並且無法區分回來的郵件。 TestMapper中的toResponse方法似乎永遠不會被調用。我需要做些什麼來實現這個目標?當然,它應該發送一個400錯誤的請求,而不是500 – maloney

+0

您可以使用狀態碼來識別錯誤的響應。如果它不好,請在您的客戶端代碼中拋出異常。 –

+0

但那不是我想要的。服務器進行一些計算並可能由於多種原因而失敗。我想從服務器返回這個原因給客戶端。 – maloney