2014-04-07 61 views
6

我正在使用JAX-RS客戶端來使用REST API。我不想讓JAX-RS拋出一堆異常,所以我正在檢查自己的對象Response。但有時候,我只關心某些狀態碼,我希望JAX-RS到回落到默認行爲並拋出一個實際的異常(將由AOP建議處理)。有沒有一個簡單的方法來做到這一點?JAX-RS:將響應轉換爲異常

public void delete(long id) { 
    Response response = client.delete(id); 
    Response.Status status = Response.Status.fromStatusCode(response.getStatus()); 

    if (status == Response.Status.OK) { 
     return; 
    } 
    if (status == Response.Status.NOT_FOUND) { 
     throw new TeamNotFoundException(); 
    } 
    if (status == Response.Status.CONFLICT) { 
     throw new TeamHasAssignedUsersException(); 
    } 

    // if status was internal server error or something similar, 
    // throw whatever exception you would throw at first place 
    // magic.throwException(response) 
} 
+0

如果您沒有從JAX-RS API獲取Response對象,它將拋出一堆異常,如BadRequestException,ClientErrorException等。但我不喜歡用異常驅動我的業務邏輯 – Xorty

+0

您的意思是當你一個類似於'client.get(Customer.class)'的TypedEntity請求,那麼你會得到這些異常,否則當直接使用'Response'時 - 不是? –

+0

是的就是這樣... – Xorty

回答

4

JAX-RS API不支持將響應轉換爲異常。如果您檢查JerseyInvocation.convertToException()方法,您會看到在澤西島這是一個簡單的開關,將Response狀態轉換爲相應的異常。

所以,你這裏有兩種選擇:

  1. 要麼你打電話webTarget.get(MyEntity.class),如果你希望一個實體機構。當然,您可以將所有WebApplicationException都捕獲到一個捕獲條款中,因爲所有例外都會擴展它(例如,檢查BadRequestException)。
  2. 或者你在你的代碼中做類似的switch條款,就像球衣一樣。