在自定义拦截器中捕获 SOAP 错误错误 (Soap12FaultOutInterceptor)

Nul*_*ion 5 java soap cxf soapfault interceptor

我编写了一个自定义 CXF 拦截器来将所有 SOAP 请求和响应记录到数据库中,并且它似乎在正面测试用例和服务器错误的情况下工作正常。

但是当发生 SOAP 错误时,它只是忽略了我的拦截器并且没有记录任何内容。

自定义 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
    .......

     }
   }
Run Code Online (Sandbox Code Playgroud)

我没有看到此方法的日志语句,而是看到了

 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 :  
Run Code Online (Sandbox Code Playgroud)

为了在我的自定义拦截器中捕获 SOAP 错误错误,我必须做什么。

fpm*_*les 3

所以在我的自定义拦截器中我编写了以下代码:

Fault fault = new Fault(message.getContent(Exception.class));
Run Code Online (Sandbox Code Playgroud)

现在,这是在一些遗留代码中,这些代码从 Java 抛出异常并让框架将其转换为错误。我不会表达我对此的感受,但这会给你带来所产生的错误。

现在,如果您从服务方法中抛出错误,请执行以下操作

Fault fault = message.getContect(Fault.class);
Run Code Online (Sandbox Code Playgroud)

希望这能帮助您得到您想要的答案。确保您注册了拦截器,如下所示

<jaxws:endpoint
  id="fooService" implementor="com.bar.FooService" address="/FooServices">
  <jaxws:outFaultInterceptors>
        <ref class="com.bar.interceptor.DbLogOutInterceptor"/>
  </jaxws:outFaultInterceptors>
</jaxws:endpoint>
<jaxws:endpoint
Run Code Online (Sandbox Code Playgroud)