camel验证组件不起作用

时间:2015-08-04 16:56:04

标签: validation xsd apache-camel schema

我的骆驼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只是为了导入一个模式,那么它可以工作。当然,如果我删除了驼峰验证器组件,那么一切都可以正常工作。

1 个答案:

答案 0 :(得分:2)

您的问题是您尝试从多个文件导入相同的命名空间,这不是一个好主意。 Aplication仅导入第一个文件,并跳过具有相同命名空间的其他文件。关于这个问题有很好的答案,可能的解决方法是:https://stackoverflow.com/a/4998182/3703819

但更好的想法是为每个xsd文件创建一个命名空间。