Servlet类中没有捕获Jersey自定义异常?

时间:2013-03-25 13:34:03

标签: java exception servlets jersey

我正在项目中使用Below Custom Exception类

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;
    }
}

我也创建了一个Mapper类..

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 个答案:

答案 0 :(得分:0)

你的servlet永远不会得到那个例外。这是因为servlet实际上是一个REST客户端,并且您正在调用远程资源方法来获取一些数据。资源调用将成功(并且某些数据将被映射回来),否则它将失败并且您将不会获得任何数据(或客户端错误)。

另外,您的服务器端异常映射器存在问题。在调用之前,您不验证该异常实际上是否有响应实体:

brexec.getResponse().getEntity()

如果异常没有响应,上面的代码将导致空指针异常。


一些快速说明:

  • 异常类已具有message属性。您无需另外定义
  • 您的异常映射器在尝试使用它之前需要检查不存在的response属性
  • servlet中的资源路径似乎与服务器端路径不匹配。我认为这是一个复制/粘贴错误。