这是我的错误拦截器:
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体(我在上面的响应变量中正确拥有)。
由于
答案 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>
在上下文中的服务器配置中。有了这个,你就可以完全访问异常,并且可以从中获得任何你想要的东西。