0

我正在使用 RESTEasy Spring MVC 集成(springmvc-resteasy 使用 RestEasy 2.0,Spring 3.0)我想通过声明 RESTEasy 异常映射提供程序将我的应用程序异常映射到 HTTP 响应。目前我的应用程序没有显式扩展javax.ws.rs.core.Application,理想情况下我想依赖框架对异常映射提供程序的自动扫描。

这是我的一个异常映射器的样子。

@Provider public class MyAppExceptionMapper implements ExceptionMapper<MyAppException> {
    public Response toResponse(MyAppException exception) {
            return Response.status(Response.Status.BAD_REQUEST).build();
    } 
}

我的异常类看起来像这样

public class MyAppException extends RuntimeException {
    public MyAppException(String s, Throwable t) {
     super(s,t);
    }
}

当我的应用程序抛出 aMyAppException时,它不会映射到 HTTP-400 响应(我从框架中获得了通常的 HTTP-500)

有什么我想念的吗?如果这是没有向框架“注册”提供程序的问题,当我使用 springmvc-resteasy 时如何注册我的异常映射器?

谢谢。

4

1 回答 1

2

我收到了 Solomon Duskis 的答复,我将其发布在这里,以确保遇到此问题的其他人能够快速解决它。正如我所怀疑的,我必须以某种方式配置 Spring 来配置 RESTEasy 以扫描我的异常映射提供程序。@Component我在异常映射器中添加了一个,它确实可以将 MyAppException 映射到正确的 HTTP 响应代码(在本例中为 400 而不是 500)。但是,这里有一个警告:MyAppException 没有被 RESTEasy 序列化,因为“ java.lang.StackTraceElement 没有无参数的默认构造函数”。我正在寻找这个次要问题的解决方案。

您可以将组件扫描自定义为@Providers,或者将@Component 添加到您的异常映射器以将其添加到您的上下文中。以下是从@Providers 扫描的方法:

<context:component-scan base-package="bean">
    <context:include-filter type="annotation" expression="javax.ws.rs.ext.Provider"/>
</context:component-scan>
于 2011-02-22T21:53:55.907 回答