0

这是我的故障拦截器:

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 配置:

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

我可以进入 handleMessage 方法没问题,但我无法修改消息。

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

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

谢谢

4

1 回答 1

4

如果您使用的是 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>

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

于 2013-04-25T20:53:07.020 回答