【问题标题】:Cxf exception mapper not being invoked未调用 Cxf 异常映射器
【发布时间】:2013-04-25 03:19:27
【问题描述】:

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

这里是相关代码

我的异常类:

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>

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

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

谢谢

【问题讨论】:

  • 您是否检查过 MyException 上的 toResponse() 方法是否被执行?
  • toResponse() 方法永远不会被执行。

标签: java spring exception-handling cxf


【解决方案1】:

如果这是您的完整 CXF,则您缺少正在执行的此服务器中的服务 bean。

提供者与服务绑定,并且只会为同样在服务器中定义的服务 bean 执行。

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

【讨论】:

  • 我确实定义了一个 serviceBean,并且我发现当异常在服务 bean 之外抛出时,异常映射器不会被调用,而如果它被抛出在 bean 内部,它会被调用。我将如何更改它以便始终调用异常映射器?
  • 为了扩展我的最后一条评论,未调用异常映射器的异常是从 bean 抛出的
  • 不确定我理解你在做什么。您有一个 serviceBean,它在方法上有一个say @POST 注释。该方法抛出 MyException 类型的异常。您已经编写了一个 ExceptionMapper 来将该异常转换为特定响应。这是 ExceptionMapper 的用例。您为部署服务 bean 的 jaxws 服务器编写了一个 Provider (ExceptionMapper)。拦截器框架处于不同的操作级别,具体取决于它是什么类型。您从未提及其他拦截器,因此请在 ? 中提供您所做的全部范围
  • 我会尽力解释这一点。我在方法上有一个带有 @POST 注释的 serviceBean。当有人发送一个 post 请求时,会有一个 inInterceptor 运行并验证一些事情。如果在那里抛出异常,则不会调用异常映射器。如果我在方法本身中抛出异常,它会起作用。这样就清楚了吗?
  • 当然,在这种情况下,您使用的异常映射器是错误的。您需要在拦截器中手动捕获异常并返回您想要的响应,或者更好的是,编写一个执行它的方面(谈论代理疯狂)。但是,您可以在出站拦截并执行相同的操作,但 ExceptionMapper 专门针对那些从您的服务类中抛出的异常。在我看来,最简单的处理方法是,如果你想要这个异常的标准响应是简单地在拦截器中处理它
【解决方案2】:

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

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

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

祝你好运!

【讨论】:

    猜你喜欢
    • 2016-10-25
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2012-05-20
    相关资源
    最近更新 更多