我编写了一个自定义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

08-04 15:16