首页 文章

Resteasy内置异常未在异常映射器中捕获

提问于
浏览
2

我编写了一些异常映射器来捕获和处理内置的休息容易异常,如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();
         }
}

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

而我已经尝试了另一个异常映射器类来处理JsonParsingException . 这是正常工作的,只要发生Json Parse异常,就会从映射器给出适当的响应 .

问题仅在于重新安排异常的情况 . 此外,提供程序已在组件扫描中使用include-filter标记在应用程序上下文中注册 .

请指导我在mapper类本身中需要做些什么来捕获简单的内置异常 .

此致,RM

3 回答

  • 0

    我有同样的问题 . 使用@Component注释NotFoundExceptionMapper应该修复它(或将NotFoundExceptionMapper作为bean添加到应用程序上下文(xml文件)) .

    当您的Spring上下文启动时,应该注册NotFoundExceptionMapper(您应该在日志记录中使用“在...中预先实例化单例”)

  • 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)卷曲测试用例:

    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
    
  • 2

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

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

相关问题