使用CXF 2.3.1。
使用JAXB从WSDL生成Java。
使用
<jaxws:properties>
<entry key="schema-validation-enabled" value="true" />
</jaxws:properties>
在客户端配置中。
我的测试创建的对象无法满足WSDL的这一特定要求:
<xsd:simpleType name="UUID.Content">
<xsd:annotation>
<xsd:documentation xml:lang="EN">
Universally Unique Identifier
</xsd:documentation>
</xsd:annotation>
<xsd:restriction base="xsd:token">
<xsd:length value="36" />
<xsd:pattern
value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}" />
</xsd:restriction>
</xsd:simpleType>
然而,消息被编组并一直通过传出的拦截器链。
WSDL是单向的:仅用于输入。
wsdlLocation在Impls中的注释中指定。
有趣的是,在解组时,拦截器链会阻止未通过验证此相同约束的传入消息。
我正在测试WebLogic。我也可以在WebSphere上进行测试。
传出的编组人员正在捕获其他XSD验证失败(例如缺少必需的元素)。
我们从2.2.6升级到CXF 2.3.1的原因是我们在入站消息中看到了类似的问题。在2.3.1中,对入站消息进行完整的XSD验证,但对出站消息不进行验证。
以下是CXF中的错误:
https://issues.apache.org/jira/browse/CXF-3233
我们通过使用org.springframework.xml.validation.XmlValidator进行验证,然后在将消息发送到CXF拦截器链之前进行验证。我希望修复使用CXF拦截器链。但是,我怀疑这是CXF中的一个错误。
答案 0 :(得分:0)
我遇到了类似的问题(CXF 2.2.7)并且能够通过将serviceName
和endpointName
属性添加到我的<jaxws:client>
bean定义来解决它。请查看“配置Spring客户端(选项1)”部分:https://cwiki.apache.org/CXF20DOC/jax-ws-configuration.html以获取有关属性的更多信息。
注意:我也定义了wsdlLocation
属性。这可能是CXF找到服务使用的XSD所必需的。
以下是我所拥有的一个例子:
<jaxws:client id="client"
serviceClass="com.example.ServiceInterface"
address="http://example.com/endpoint"
wsdlLocation="WEB-INF/wsdl/SampleWSDLFile.wsdl"
serviceName="s:SampleService"
endpointName="s:SampleServicePort"
xmlns:s="http://www.example.com/some/namesapce">
...
</jaxws:client>
我还注意到,当我遇到此问题时,每次调用客户端时,org.apache.cxf.wsdl.EndpointReferenceUtils
类都会将整个架构打印到我的日志文件中。当我像上面那样设置我的客户端bean时,这种行为就消失了。我不知道你是否也会看到类似的东西......
我应该提到的另一个细节是,当我没有使用WHICH_JARS
文件中列出的所有CXF提供的库时,我有很多来自CXF的意外行为。我也会尝试将它们添加到构建中,以便它们覆盖任何服务器或Java提供的库。如果没有必要,您可以随后将其删除。