Apache CXF mustUnderstand boolean vs integer

时间:2017-07-14 00:04:09

标签: java spring-boot soap cxf

我正在使用Apache CXF 3.1.12(使用springboot)使用soap 1.1服务

我试图理解如何强制它将mustUnderstand头生成为整数(0 | 1)而不是boolean(true | false)。请参阅下面的错误文档。根据我的理解,在肥皂1.1中,真/假是不可接受的。无论如何,我的客户不喜欢它,我无法控制它们。

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
    <s:Header>
        <a:Action s:mustUnderstand="true">http://...</a:Action>
    </s:Header>
    <s:Body>
     ...
    </s:Body>
</s:Envelope>

这是一个WSDL优先服务,并且在WSDL中没有提到SOAP 1.2命名空间。我的包裹信息是:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://...", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

,我的端点创建于:

EndpointImpl endpoint = new EndpointImpl(bus,
                 new MyClass(), SOAPBinding.SOAP11HTTP_BINDING);

我使用hdr-&gt; setMustUnderstand(true)修改Phase.WRITE中的AbstractSoapInterceptor中的mustUnderstand标头,但它仍然以布尔值的形式出现。

JIRA中有一个关于此问题的旧问题,并且在很久以前被标记为已修复:https://issues.apache.org/jira/browse/CXF-2213?jql=text%20~%20%22mustUnderstand%22

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我设法通过强制响应成为拦截器中的SOAP 1.1响应来解决这个问题,通过:

final SoapVersion soap11 = Soap11.getInstance();
message.setVersion(soap11);

我怀疑这是正确的方法,我不确定为什么它坚持认为它不是SOAP 1.1消息。但这至少解决了上面的具体问题,并允许我继续进行,直到找到正确的方法。