CXF webservice:拦截器未触发

时间:2016-04-26 12:19:53

标签: java web-services soap cxf soapfault

我们目前在Jboss EAP 6.2上遇到自定义SoapFault异常的CXF 2.7.3问题。

发送自定义SoapFault时,不会显示子代码及其值:

以下是我们想要的cxf:

<?xml version="1.0" encoding="UTF-8"?>
<tns:Fault 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:tns="http://www.w3.org/2003/05/soap-envelope">
   <tns:Code>
       <tns:Value>tns:Sender</tns:Value>
       <tns:Subcode>
          <tns:Value>value</tns:Value>
       </tns:Subcode>
   </tns:Code>
   <tns:Reason>
       <tns:Text xml:lang="fr">
****
       </tns:Text>
   </tns:Reason>
   <tns:Detail>
**Custom fault***
   </tns:Detail>
</tns:Fault>

这是我们到目前为止所做的:

<?xml version="1.0" encoding="UTF-8"?>
<tns:Fault 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:tns="http://www.w3.org/2003/05/soap-envelope">
   <tns:Code>
       <tns:Value>tns:Sender</tns:Value>
   </tns:Code>
   <tns:Reason>
       <tns:Text xml:lang="fr">
****
       </tns:Text>
   </tns:Reason>
   <tns:Detail>
**Custom fault***
   </tns:Detail>
</tns:Fault>

子代码完全丢失。

我们试图从CXF中使用自定义拦截器(从LoggingOutInterceptor或AbstractInterceptor扩展)来拦截自定义错误:

public class SoapRequestInterceptor extends LoggingOutInterceptor  {

        private static Logger log = Logger.getLogger(SoapRequestInterceptor.class);

    public SoapRequestInterceptor() {
        super(Phase.MARSHAL);

    }

        public void handleMessage(SoapMessage message) throws Fault{
                 SoapMessage soapMessage =  message.getContent(SoapMessage.class);

                 if (soapMessage != null) {
                     log.info( "request intercepted:" + soapMessage.toString());
                 }

        }

}

当我们将他添加到CXF总线或jaxws拦截器时,甚至不会调用拦截器(虽然它通过构造函数,但它在应用程序的开头添加)。 我们如何拦截自定义soap Fault消息并在CXF中编辑它?

非常感谢!

正如我们所要求的那样,我们在spring applicationContext.xml中声明拦截器的方式:

<cxf:bus>
        <cxf:outFaultInterceptors>
            <ref bean="soapRequestInterceptor" />
        </cxf:outFaultInterceptors>
    </cxf:bus>

    <bean id="soapRequestInterceptor" class="fr.test.SoapRequestInterceptor" />

    <jaxws:server serviceClass="fr.test.PriseEnChargeB2ServiceSP"
        address="" serviceBean="#service">
        <jaxws:binding>
            <soap:soapBinding version="1.2" mtomEnabled="true" />
        </jaxws:binding>
    </jaxws:server>

注意:拦截器很好,但在我们的WS发出肥皂故障后没有被调用

我们的WS结束时抛出的异常是这样的:

public class PecSoapFaultException extends SoapFault {

    private static final long serialVersionUID = 1L;

    public TypeErreur erreur;

    public PecSoapFaultException(String message, TypeErreur structure) {
        super(message, new QName(""));
        this.erreur = structure;
    }

    public PecSoapFaultException(String message, TypeErreur structure, QName faultcode) {
        super(message, faultcode);
        this.erreur = structure;
    }

    public PecSoapFaultException(String message, TypeErreur structure, QName faultcode,
            QName subcode) {
        super(message, faultcode);

        this.setSubCode(subcode);
        this.erreur = structure;
    }

    public TypeErreur getFaultInfo() {
        return erreur;
    }

1 个答案:

答案 0 :(得分:1)

未调用拦截器的问题是您没有覆盖正确的方法。你应该有这样的代码:

    @Override
    public void handleMessage(Message message) throws Fault {
        SoapMessage soapMessage =  message.getContent(SoapMessage.class);

        if (soapMessage != null) {
            log.info( "request intercepted:" + soapMessage.toString());
        }

    }

然后你的拦截器将被调用。但正如我在评论中所说:如果出现错误,则肥皂消息为空。因此,您不会在日志中获得任何输出。