我的骆驼cxf(2.15.2)路线工作正常。然后需求说我们需要针对xsd验证soap请求。我尝试添加验证器组件:
from ("direct:xxx")
.to("validator:/path/to/CustomerRequest.xsd")
我的CustomerRequest.xsd已导入其他xsd(s)。
<xsd:import schemaLocation="../vo/Address.xsd" namespace="http://vo.customer.com" />
<xsd:import schemaLocation="../vo/CustSourceEnum.xsd" namespace="http://vo.customer.com"></xsd:import>
但是当我运行启动应用程序时,会发生错误。它抱怨CustSourceEnum
org.apache.camel.FailedToCreateProducerException: Failed to create Producer for endpoint: Endpoint[validator:/path/to/xsd/CustomerRequest.xsd].
Reason: org.xml.sax.SAXParseException; lineNumber: 27; columnNumber: 115; src-resolve: Cannot resolve the name 'vo:CustSourceEnum' to a(n) 'type definition' component.
at org.apache.camel.impl.ProducerCache.doGetProducer(ProducerCache.java:407)
...
Caused by: org.xml.sax.SAXParseException; lineNumber: 27; columnNumber: 115; src-resolve: Cannot resolve the name 'vo:CustSourceEnum' to a(n) 'type definition' component.
我仔细检查了xsd中的所有引用都没问题。
现在,奇怪的是如果我更改导入的顺序:首先是地址,然后是CustSourceEnum:
<xsd:import schemaLocation="../vo/CustSourceEnum.xsd" namespace="http://vo.customer.com"></xsd:import>
<xsd:import schemaLocation="../vo/Address.xsd" namespace="http://vo.customer.com" />
然后一个错误仍然发生,但现在它抱怨'vo:地址'。
如果我尝试修改CustomerRequest.xsd
只是为了导入一个模式,那么它可以工作。当然,如果我删除了驼峰验证器组件,那么一切都可以正常工作。
答案 0 :(得分:2)
您的问题是您尝试从多个文件导入相同的命名空间,这不是一个好主意。 Aplication仅导入第一个文件,并跳过具有相同命名空间的其他文件。关于这个问题有很好的答案,可能的解决方法是:https://stackoverflow.com/a/4998182/3703819
但更好的想法是为每个xsd文件创建一个命名空间。