CXF异常映射器未被调用。

3

我创建了一个自定义异常,并编写了一个异常映射器,当我的异常被抛出时,我希望它能够被调用,从而返回正确的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-config

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

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

异常和异常映射器位于两个不同的项目中,但是我认为这不应该有影响,因为它们都在类路径中。

谢谢


你是否检查了MyException类中的toResponse()方法是否得到执行? - Bhushan Bhangale
toResponse() 方法从未被执行。 - user1751547
2个回答

5

如果这是您完整的CXF,那么在执行此服务器时,您缺少服务bean。

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

除此之外,一切看起来都很好,因此请检查并确保实际上抛出了异常。


我已经定义了一个serviceBean,并发现当异常在service bean之外抛出时,异常映射器不会被调用,而如果在bean内部抛出,则会被调用。我该如何更改以使异常映射器始终被调用? - user1751547
为了进一步解释我的上一个评论,异常映射器未被调用的异常是从jaxrs:inInterceptor bean中抛出的。 - user1751547
不确定我理解你正在做什么。您有一个serviceBean,在其中一个方法上有一个say @POST注释。该方法抛出类型为MyException的异常。您编写了一个ExceptionMapper将该异常转换为特定响应。这是ExceptionMapper的使用案例。您为部署服务bean的jaxws服务器编写提供程序(ExceptionMapper)。拦截器框架在不同级别的操作中,具体取决于它是什么类型。您没有提到其他拦截器,请提供您正在进行的所有工作范围。 - fpmoles
我会尽力解释清楚这个问题。我有一个serviceBean,其中一个方法带有@POST注释。当有人发送一个post请求时,会运行一个inInterceptor来验证一些内容。如果在此过程中抛出异常,则不会调用异常映射器。如果我在方法内部抛出异常,则可以正常工作。这样清楚了吗? - user1751547
1
你在这种情况下错误地使用了异常映射器。你需要在拦截器中手动捕获异常并返回所需的响应,或者更好的方法是编写一个切面来处理它(谈论代理疯狂)。但是你可以在出站时进行拦截并执行相同的操作,但是ExceptionMapper专门用于处理从你的服务类中抛出的异常。在我看来,处理此异常的最简单方法是在拦截器中处理它,如果你想要一个标准响应。 - fpmoles
谢谢,我会采用这种方法。 - user1751547

0
异常映射器只处理服务bean抛出的异常。
在这种情况下,一种选择是抛出新的WebApplicationException(Throwable, Response),其中响应应该与您的异常映射器中所做的相同。
如果您正在尝试进行某些验证,则创建自定义消息正文读取器是一个不错的选择。通过这样做,在消息正文读取器内部,您还可以访问其他提供程序/异常映射器。
祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接