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

时间:2012-04-20 18:34:23

标签: spring exception resteasy

我编写了一些异常映射器来捕获和处理内置的休息容易异常,如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异常,就会从映射器给出正确的响应。

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

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

此致 RM

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

这是我的演示项目

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

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 case:

$ 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 :(得分:0)

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

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