未调用Cxf异常映射器

时间:2013-04-25 03:19:28

标签: java spring exception-handling cxf

我创建了一个自定义异常,并且我有一个异常映射器,我想在抛出异常时调用它,这样我就可以返回正确的http返回代码和消息,但由于某种原因它不适用于我的异常。

以下是相关代码

My Exception class:

public class MyException extends ApplicationRuntimeException
{

    private static final long serialVersionUID = 1L;

    public MyException ()
    {
        super();
    }

    public MyException (String message)
    {
        super(message);
    }

    public MyException (String message, ErrorCode errorCode)
    {
        super(message, errorCode);
    }

    public MyException (Throwable t)
    {   
        super(t);
    }

    public MyException (String message, Throwable t)
    {
        super(message, t);
    }

}

我的异常映射器类

@Provider
public class MyExceptionMapper implements ExceptionMapper<Exception>
{
    @Override
    public Response toResponse(Exception exception)
    {
        //code
        return response;
    }
}

CXF-配置

<jaxrs:server id="serviceId" address="/">
        <jaxrs:providers>
            <bean class="com.package.MyExceptionMapper"/>
        </jaxrs:providers>
</jaxrs:server>

这基本上就是我的代码,我有什么遗漏或者我需要提供的任何其他信息才能解决这个问题吗?

异常和异常映射器位于两个不同的项目中,但我认为这不重要,因为它们都在类路径中。

由于

2 个答案:

答案 0 :(得分:5)

如果这是您的完整CXF,那么您正在丢失正在执行的服务器中的服务bean。

提供程序与服务绑定,仅对服务器中定义的服务bean执行。

除此之外一切看起来都很好所以我会检查并确保你的异常真的被抛出。

答案 1 :(得分:0)

异常映射器只处理服务bean抛出的异常。

在这种情况下,一个选项是抛出一个新的WebApplicationException(Throwable,Response),其中响应的构建方式与在异常映射器中完成的方式相同。

如果您正在尝试进行一些验证,我认为创建自定义邮件正文阅读器是一个不错的选择。通过这样做,在消息体读取器内部,您还可以访问其他提供者/异常映射器。

祝你好运!