2013-03-25 91 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的资源路径似乎并没有在服务器端匹配路径。我认为这是一个复制/粘贴错误。