【问题标题】:Resteasy in-built exceptions not caught in the exception mapperResteasy 内置异常未在异常映射器中捕获
【发布时间】:2012-04-20 18:34:22
【问题描述】:

我写了一些异常映射器来捕捉和处理内置的rest easy异常,如NotFoundException、MethodNotAllowedException等,示例代码如下所示:

@Provider
public class NotFoundExceptionMapper implements ExceptionMapper<org.jboss.resteasy.spi.NotFoundException>
{
    @Override
    Response toResponse(org.jboss.resteasy.spi.NotFoundException exception) {
         return Response.status(500).build();
         }
}

我还在我的网络过滤器类中编写了一个 try catch 块。每当发生 NotFoundException 时,它不会被映射器捕获,而是会进入 Filter 中的 catch 块。

而我已经尝试了另一个异常映射器类来处理 JsonParsingException。每当发生 Json Parse 异常时,它都能正常工作并从映射器给出正确的响应。

问题仅在于 resteasy 异常的情况。 此外,Provider 已使用组件扫描中的 include-filter 标记在应用程序上下文中注册。

请指导我如何在映射器类本身中捕获简单的内置异常。

问候, RM

【问题讨论】:

    标签: spring exception resteasy


    【解决方案1】:

    我遇到了同样的问题。使用 @Component 注释 NotFoundExceptionMapper 应该可以修复它(或将 NotFoundExceptionMapper 作为 bean 添加到您的应用程序上下文(xml 文件)中)。

    当你的 Spring 上下文启动时,NotFoundExceptionMapper 应该被注册(你应该在你的日志中出现类似“Pre-instantiating singletons in ...”)

    【讨论】:

      【解决方案2】:

      这是我的演示项目

      1) 一个简单的 RESTful 应用,包含 3 个 java 文件:

      1.1) RestNotFoundExceptionHandler.java

      package demo.app;
      
      import javax.ws.rs.NotFoundException;
      import javax.ws.rs.core.MediaType;
      import javax.ws.rs.core.Response;
      import javax.ws.rs.ext.ExceptionMapper;
      import javax.ws.rs.ext.Provider;
      
      @Provider
      public class RestNotFoundExceptionHandler implements ExceptionMapper<NotFoundException> {
          @Override
          public Response toResponse(NotFoundException e) {
              return Response.ok().entity(e.toString() + "\n").type(MediaType.TEXT_PLAIN).build();
          }
      }
      

      1.2) AppRest.java

      package demo.app;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.ws.rs.GET;
      import javax.ws.rs.Path;
      import javax.ws.rs.Produces;
      import javax.ws.rs.core.Context;
      import javax.ws.rs.core.MediaType;
      
      @Path("/")
      public class AppRest {
          @GET
          @Path("millis")
          @Produces(MediaType.TEXT_PLAIN)
          public String refresh(@Context HttpServletRequest request) {
              try {
                  return Long.toString(System.currentTimeMillis()) + "\n";
              } catch (Exception e) {
                  return e.toString() + "\n";
              }
          }
      }
      

      1.3) AppMain.java

      package demo.app;
      
      import javax.ws.rs.NotFoundException;
      import org.jboss.resteasy.plugins.server.tjws.TJWSEmbeddedJaxrsServer;
      
      public class AppMain {
          private static final int PORT = 8080;
      
          public static void main(String[] args) {
              AppRest appRest = new AppRest();
              TJWSEmbeddedJaxrsServer tjws = new TJWSEmbeddedJaxrsServer();
              tjws.setPort(PORT);
              tjws.setRootResourcePath("/rest");
              tjws.start();
              tjws.getDeployment().getRegistry().addSingletonResource(appRest);
              tjws.getDeployment().getProviderFactory().getExceptionMappers()
                      .put(NotFoundException.class, new RestNotFoundExceptionHandler());
          }
      }
      

      2) 项目依赖,4个jar文件

      jaxrs-api-3.0.9.Final.jar
      resteasy-jaxrs-3.0.9.Final.jar
      servlet-api-2.5.jar
      tjws-3.0.9.Final.jar
      

      3) curl 测试用例:

      3.1) 正常情况:

      $ curl http://127.0.0.1:8080/rest/millis
      1419167594504
      

      3.2) RestNotFoundExceptionHandler 案例:

      $ curl http://127.0.0.1:8080/rest/bad
      javax.ws.rs.NotFoundException: Could not find resource for full path: http://127.0.0.1:8080/rest/bad
      

      【讨论】:

        【解决方案3】:

        我尝试了同样的事情,但在尝试映射 UnsupportedMediaTypeException 时遇到了麻烦。

        根据http://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/ExceptionHandling.html 和异常映射部分下的第一行,您似乎只能映射应用程序异常。

        【讨论】:

        • 我有完全相同的问题,我已经为我的自定义 ExceptionMapper 设置了 @Provider 注释,并且还在 web.xml 中注册了映射器,但映射器仍然没有处理异常。我尝试使用 RuntimeExceptions 和 Exception 来扩展,但没有区别......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-14
        • 1970-01-01
        • 2012-05-31
        相关资源
        最近更新 更多