java - Jersey 自定义异常未在 Servlet 类中捕获?

标签 java exception servlets jersey

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

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中它将Exception捕获而不是在BadRequestException Catch block 中。 谁能知道我做错了什么。

最佳答案

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

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

brexec.getResponse().getEntity()

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

<小时/>

一些快速说明:

  • 异常类已经有一个 message 属性。您不需要定义额外的
  • 您的异常映射器需要先检查不存在的 response 属性,然后再尝试对其执行某些操作
  • servlet 中的资源路径似乎与服务器端路径不匹配。我认为这是一个复制/粘贴错误。

关于java - Jersey 自定义异常未在 Servlet 类中捕获?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15616264/

相关文章:

java - onBeforeRender() 内的 Wicket setResponsePage()

java - 使用按钮停止和开始循环

c# - 发送 webRequest 时出错

用于登录的 Java 父类(super class)用户

java - 部署简单的 Web 应用程序时,java 文件(即 servlet)不在服务器 (Tomcat) 上运行

java - Guice-servlet 单元测试

java - 如何从 Play Framework 的配置文件中读取对象列表

java - 仅将 Spring Security 应用于一页

java - 为什么会出现 java.util.ConcurrentModificationException?

java - 如何在java类中处理和显示DataDecodeException日志