我编写了一个自定义CXF拦截器,将所有SOAP请求和响应都记录到数据库中,并且在积极的测试用例和服务器错误中似乎运行良好。
但是,当发生SOAP Fault时,它只会忽略我的拦截器,而不会记录任何内容。
自定义CXF拦截器。
public class DbLogOutInterceptor extends AbstractSoapInterceptor {
public void handleMessage(SoapMessage message) {
logger.info("Handling outbound request");
String transaction = MDC.get(mdcKey);
logger.info("OutBound Transaction ID : {} ", transaction);
//code to log the SOAP message in database
.......
}
}
我没有从此方法中看到日志语句,而是看到了
11:56:34,102 INFO [Soap12FaultOutInterceptor] class org.apache.cxf.binding.soap.interceptor.Soap12FaultOutInterceptor$Soap12FaultOutInterceptor Internalapplication/soap+xml
11:56:34,103 INFO [EligibilityInfo] Outbound Message
---------------------------
ID: 2
Response-Code: 500
Encoding: UTF-8
Content-Type: application/soap+xml
Headers: {}
Payload :
为了在我的自定义拦截器中捕获SOAP错误错误,我必须做的是。
最佳答案
因此,在我的自定义拦截器中,我编写了以下代码:
Fault fault = new Fault(message.getContent(Exception.class));
现在,这是在一些旧代码中,这些代码从Java中引发异常,并使框架将其转换为错误。我不会对此产生任何感觉,但这会带给您所产生的错误。
现在,如果您从服务方法中抛出错误,请执行
Fault fault = message.getContect(Fault.class);
希望这将帮助您获得所需的答案。确保按如下所示注册拦截器
<jaxws:endpoint
id="fooService" implementor="com.bar.FooService" address="/FooServices">
<jaxws:outFaultInterceptors>
<ref class="com.bar.interceptor.DbLogOutInterceptor"/>
</jaxws:outFaultInterceptors>
</jaxws:endpoint>
<jaxws:endpoint