我正在尝试向工作中调用Web服务的Java应用程序添加一些向前兼容性,但是我遇到了JAX-WS的一些问题...
该应用程序使用wsdl2java
Maven插件从WSDL生成CXF Web服务客户端。然后,它将使用生成的客户端(通过JMS上的SOAP)与Web服务进行通信。 (可能值得注意的是,尽管我不确定,wsdlLocation
的{{1}}属性由于某些原因未填写,也许是因为WSDL本身是由Tibco Web Service和因此,缺少了一些要按原样使用的数据,例如Web服务的位置,这些数据是在<jaxws:client/>
的{{1}}元素中完成的...)
由于JAXB在XML方面非常宽松(请参阅my previous question),因此我决定启用模式验证(<jaxws:client/>
),该方法效果很好,并且为了提高向前兼容性,我使用了{{1 }}属性和application-context.xml
元素,如下所示:
<jaxws:client><jaxws:properties><entry key="schema-validation-enabled" value="true"/></jaxws:properties></jaxws:client>
因此,当Web服务在类型的末尾添加元素时,应用程序应将其放在“ any”数组中,并忽略它。
请注意,nillable
元素未提及其<any/>
属性,应默认为<complexType>
<sequence>
<element nillable="true"/>
<element nillable="true">
<complexType>
<sequence>
<element nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
</element>
<any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
</complexType>
。
但是,当我尝试运行该应用程序时,出现以下错误:
<any/>
因此,似乎尽管没有namespace
,但JAX-WS还是使用##any
而不是Unmarshalling Error: cvc-complex-type.2.4.a : Invalid content was found starting with element 'ns0:SomeNewElement'. One of '{WC[##other:\"http://some/namespace\"]}' is expected.
。
我还尝试了其他命名空间,例如namespace
或namespace="##other"
或namespace="##any"
,它们的结果完全相同。
为什么JAX-WS会忽略##targetNamespace
的{{1}},以及如何充分利用##any
元素呢?