Apache Camel XML Validator

时间:2017-02-26 13:28:51

标签: xml validation xsd apache-camel

我正在使用apache camel v2.12蓝图。在我的一条路线中,我暴露了一个通过POST请求消耗xml的码头端点。我想针对xsd文件验证入站xml,该文件位于另一个bundle的root中。我已将该依赖项包含在我的pom文件中,并在features.xml中包含指定的包。

这是我的路线定义:

<camel:route id="someId">
        <camel:from uri="{{jetty.uri}}"/>
        <camel:to uri="validator:/sample.xsd"/>         
        <camel:convertBodyTo type="java.lang.String"/>      
        <camel:to uri="{{to.target.uri}}" pattern="InOnly"/>            
</camel:route>

我在日志文件中得到以下异常

org.apache.camel.FailedToCreateRouteException: Failed to create route someId at: >>> To[validator:/sample.xsd] <<< in route: Route(someId)[[From[{{jetty.uri... because of Failed to resolve endpoint: validator:///sample.xsd due to: Cannot find resource: /sample.xsd in classpath for URI: /sample.xsd
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:912)[143:org.apache.camel.camel-core:2.12.0.redhat-610379]
at org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:177)[143:org.apache.camel.camel-core:2.12.0.redhat-610379]
at org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:778)[143:org.apache.camel.camel-core:2.12.0.redhat-610379]
at org.apache.camel.impl.DefaultCamelContext.startRouteDefinitions(DefaultCamelContext.java:1955)[143:org.apache.camel.camel-core:2.12.0.redhat-610379]

如果我将sample.xsd放在工作模块'src / main / resources'下,那么camel验证器组件就可以查找了。我从前面删除了斜杠'/'

<to uri="validator:sample.xsd"/>

我想避免重复架构,只是从另一个包中引用它。

我编写了一个测试java类来检查资源是否可加载,并且能够在jar文件下找到xsd

System.out.println(Test.class.getResource("/sample.xsd"));

请帮助如何从不同的捆绑中引用xsd文件。

1 个答案:

答案 0 :(得分:1)

你应该可以从包A中导出你的XSD文件(A在它的jar中有一个实际的XSD)并从包B中导入它(B在它的jar中没有XSD)。这应该与导入/导出类完全相同。

Bundle A
<Export-Package>my.package.with.xsd.file,*</Export-Package>

或者,您可以尝试使用捆绑包A来读取文件并导出捆绑包B将使用的OSGI服务。然后问题可能是Camel Validator Producer可以直接接受InputStream而不是XSD文件。看一下org.apache.camel.processor.validation.ValidatingProcessor和ValidatorEndpoint。但无论如何,您可以在Route中的Java处理器中手动进行验证。