如何强制handleFault被调用

问题描述

我已经使用Apache CXF Web服务实现了处理程序。我的意图是跟踪异常并记录更多信息。 处理程序代码的片段如下

public class SoapFaultHandler  implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
       //what should be thrown from here or web service so that handleFault() is called
       

    }
    @Override
    public boolean handleFault(SOAPMessageContext context) {
    }
    //......................
}

我曾尝试从handleMessage()抛出javax.xml.ws.soap.SOAPFaultException(),但未调用handleFault。有人可以给点提示吗?

编辑: 从handleMessage()引发的异常未到达同一处理程序中定义的handleFault()。但是,最近我发现从Web服务抛出SoapFault异常时会调用handleFault()。 下面是代码片段。

 catch(CustomException e)
 { 
   String codeStr =//custom string here
   QName faultCode = new  QName("http://cxf.apache.org/soapfault",codeStr);
   String faultString = e.toString();
   SoapFault soapFault = new SoapFault(faultString,faultCode);
   throw soapFault;
}

在Java客户端中,这是作为SOAPFaultException出现的,我不得不调用 .getCause()以获取CXF SoapFault对象。

解决方法

您可以在端点注册中注册IN / OUT故障拦截器。

    @Bean
    public Endpoint awesomeEndpoint() {
        EndpointImpl endpoint = new EndpointImpl(springBus(),awesomeServiceImpl());

        endpoint.getInFaultInterceptors().add(new AwesomeFaultInInterceptor());
        endpoint.getOutFaultInterceptors().add(new AwesomeFaultOutInterceptor());
            
        endpoint.publish("/awesomeService");
        
        return endpoint;
    }

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...