Cxf jaxrs:outFaultInterceptors无法修改消息

时间:2013-04-25 20:04:10

标签: java spring cxf jax-rs interceptor

这是我的错误拦截器:

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体(我在上面的响应变量中正确拥有)。

由于

1 个答案:

答案 0 :(得分:3)

如果您正在使用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>

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