JAXB模式验证未在出站消息与CXF 2.3.1发生
-
25-09-2019 - |
题
使用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升级到2.3.1的CXF的是,我们看到在入站邮件类似的问题。在2.3.1,完整XSD验证发生入站消息而不是出站的。
下面是在CXF错误:
https://issues.apache.org/jira/browse/CXF-3233
我们工作围绕此通过使用org.springframework.xml.validation.XmlValidator来验证发送消息到CXF拦截器链之前。我希望为使用CXF拦截器链修复。然而,我怀疑这是在CXF的一个错误。
解决方案
我有类似的问题(CXF 2.2.7),并能够通过添加serviceName
和endpointName
属性我<jaxws:client>
bean定义来解决它。检查出的部分“配置春季客户端(选项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像上面的。我不知道如果你看到类似的东西太...
我要提到的另一个细节是,我有很多的来自CXF意外的行为,当我没有使用所有的WHICH_JARS
文件中列出了CXF提供的库。我也尝试将它们添加到构建,使他们覆盖任何服务器或Java提供的库。以后您可以随时删除它们,如果它们是没有必要的。