【问题标题】:Cxf jaxrs:outFaultInterceptors unable to modify messageCxf jaxrs:outFaultInterceptors 无法修改消息
【发布时间】:2013-04-19 21:06:34
【问题描述】:

这是我的错误拦截器:

public class OutFaultInterceptor extends AbstractPhaseInterceptor<Message> {

   public OutFaultInterceptor() {
        super(Phase.SEND);
    }

        @Override
        public void handleMessage(Message message) throws Fault 
        {   
            Fault fault = (Fault)message.getContent(Exception.class);
            Throwable ex = fault.getCause();
            Response response = JAXRSUtils.convertFaultToResponse(ex, message);
            message.setContent(Response.class, response);
    }
}

这是我相关的 cxf-config:

    <jaxrs:outFaultInterceptors>
        <bean id="outfault" class="com.xxx.OutFaultInterceptor"/>
    </jaxrs:outFaultInterceptors>

我可以进入handleMessage方法没有问题,但是我不能修改消息。

目前它返回的是默认值:ns1:XMLFault blah blah...

我想要返回的是一个 Response 对象,它有一个正确的 HTTP 响应代码和一个 json 主体(我在上面的响应变量中正确地拥有了)。

谢谢

【问题讨论】:

    标签: java spring cxf jax-rs interceptor


    【解决方案1】:

    如果您使用的是 JAX-RS,为什么不设置一个异常映射器,然后使用该映射器来处理响应。

    一个简单的例子:

     @Provider
        @Produces(MediaType.APPLICATION_JSON)
        public class MyExceptionMapper implements
                ExceptionMapper<MyException> {
    
            @Override
            public Response toResponse(MyException e) {
                return Response.status(Status.NOT_FOUND).build();
            }
    
        }
    

    然后您需要通过添加以下内容在 jaxrs 服务中注册提供程序:

    <jaxrs:providers>
        <bean class="com.blah.blah.blah.blah.MyExceptionMapper"/>  
    </jaxrs:providers>
    

    在上下文中的服务器配置中。有了它,您就可以完全访问异常,并且可以从中获取任何您想要的东西。

    【讨论】:

    • 我在 redhat fuse esb 中使用 apache cxf 和 apache camel。我将 2.6.0.redhat-60024 用于 redhat 提供的 cxf jar,虽然 2.7.0 版本也可用于 cxf jar,但您建议的 ExceptionMapper 在 2.7.8 之后可用(根据 cxf doc),所以我不能使用你建议的代码,你能建议我用其他方法来解决同样的问题吗...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多