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

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

而我尝试了另一个异常映射器类来处理 JsonParsingException。这可以正常工作,并在发生 Json Parse 异常时从映射器给出正确的响应。

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

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

问候, RM

4

3 回答 3

2

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

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

于 2014-02-28T06:38:15.647 回答
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 案例:

$ 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
于 2014-12-21T13:32:30.783 回答
0

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

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

于 2012-04-25T19:46:50.773 回答