2013-03-25 87 views
1

我在我的項目澤西自定義異常沒有抓住Servlet類?

public class BadRequestException extends WebApplicationException { 
    private static final long serialVersionUID = 1L; 
    private String message; 
    public BadRequestException(String message) { 
     super(); 
     this.message = message; 
    } 
    public String getMessage() { 
     return message; 
    } 
    public void setMessage(String message) { 
     this.message = message; 
    } 
} 

我創建了一個映射類還使用下面自定義異常類..

public class BadRequestExceptionMapper implements ExceptionMapper<BadRequestException> { 
    public Response toResponse(BadRequestException brexec) { 
     return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(brexec.getResponse().getEntity()).type(MediaType.APPLICATION_JSON).build(); 
    } 
} 

我通過的Servlet叫着我的服務和拋出異常通過它的一種方法,但我無法在Servlet類中捕獲它。我使用下面的代碼來捕捉異常。

try{ 
    //Some Business logic then 
    service.path("restful").path("jwbservice/" + methodName + "/" + id).header("lid", lid).delete(String.class); 
    } 
    catch (BadRequestException ex) { 
    out.println(ex); 
    } 
    catch(Exception exe){ 
    out.println(exe); 
    } 

而我在我的Service類中使用這個代碼的服務方法會拋出異常。

@DELETE 
    @Path("/deleteLink/{id}") 
    @Produces(MediaType.APPLICATION_JSON) 
    public String deleteLink(@PathParam("id") int id, @HeaderParam("lid") String lid) throws BadRequestException { 
    if (id<= 0) { 
     throw new BadRequestException("Required Parameter: id"); 
     } 
//Some Business Logic 
} 

我的服務BadRequestException但在Servlet的它會異常抓不BadRequestException catch塊。 任何人都可以知道我做錯了什麼。

+1

請關注[本](http://avianey.blogspot.in/2011/12/exception-mapping-jersey.html)並嘗試 – chiru 2013-03-25 13:42:23

回答

0

你永遠不會在你的servlet中得到這個異常。這是因爲servlet實際上是一個REST客戶端,並且您正在調用遠程資源方法來獲取一些數據。資源調用將成功(並且一些數據將被映射回),否則將失敗,並且您將不會獲得數據(或客戶端錯誤)。

請注意,服務器端異常映射器存在問題。你不驗證例外實際上有一個響應實體之前調用:

brexec.getResponse().getEntity() 

在異常沒有響應上面的代碼會導致空指針異常的情況。


一些快速筆記:

  • 異常類已經有一個message財產。你並不需要定義一個額外的一個
  • 你的例外映射需要檢查一個不存在的response財產,試圖用它做什麼之前
  • 在servlet的資源路徑似乎並沒有在服務器端匹配路徑。我認爲這是一個複製/粘貼錯誤。