1

我在我的项目中使用自定义异常类

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

我在我的服务类中使用了这个代码的服务方法会抛出异常。

@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 块中捕获异常。任何人都可以知道我做错了什么。

4

1 回答 1

0

您永远不会在您的 servlet 中遇到该异常。这是因为 servlet 实际上是一个 REST 客户端,并且您正在调用远程资源方法来获取一些数据。资源调用要么成功(并且一些数据将被映射回来),要么失败并且您将没有数据(或客户端错误)。

附带说明一下,您的服务器端异常映射器存在问题。在调用之前,您没有验证异常是否确实具有响应实体:

brexec.getResponse().getEntity()

在异常没有响应的情况下,上述代码将导致空指针异常。


一些快速说明:

  • 异常类已经有一个message属性。您不需要再定义一个
  • 您的异常映射器需要检查一个不存在的response属性,然后再尝试对其进行处理
  • servlet 中的资源路径似乎与服务器端路径不匹配。我认为这是一个复制/粘贴错误。
于 2013-03-25T13:44:10.490 回答