2017-02-26 242 views
0

我使用Apache的駱駝V2.12與藍圖。在我的一個路由中,我暴露了一個通過POST請求消耗xml的碼頭端點。我想驗證入站xml是否位於另一個包的根目錄中的xsd文件。我已將該依賴項包含在我的pom文件中,並在features.xml中指定了包。Apache的駱駝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] 

以下異常,如果我把下工作的模塊 '的src/main /資源' sample.xsd然後駱駝驗證器組件能夠查找。我從前面刪除斜槓'/'

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

我想避免重複架構,只是從另一個包中引用它。

我寫了一個測試Java類,以檢查資源是否加載與否和它能夠找到下jar文件的XSD

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

請幫助如何從不同的捆綁是指XSD文件。

+1

OSGi是很難在這一點,你需要導出|導入這兩個包間的java包,並把XSD文件在該包,不使用根包 –

+0

感謝您的答覆。我編寫了一個定製處理器,可以從classpath資源中提取xsd,並使用此bean端點驗證xml。 – user2191296

回答

1

你應該可以從bundle A(A在jar裏面有實際的XSD)導出你的XSD文件,並從bundle B中導入它(B在它的jar中沒有XSD)。這應該與導入/導出類完全相同。

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

或者,您可以嘗試讓bundle A讀取該文件並導出bundle B將使用的OSGI服務。那麼問題可能在於Camel Validator Producer可以直接接受InputStream而不是XSD文件。看看org.apache.camel.processor.validation.ValidatingProcessor和ValidatorEndpoint。但是無論如何,您可以在路由中的Java處理器中手動執行驗證。