2017-02-26 3 views
0

Ich benutze Apache Kamel v2.12 mit Blueprint. In einer meiner Route exponiere ich einen Jetty-Endpunkt, der xml über POST-Anfrage verbraucht. Ich möchte das eingehende xml gegen die xsd-Datei validieren, die sich in der Wurzel eines anderen Pakets befindet. Ich habe diese Abhängigkeit in meine Pom-Datei und das angegebene Bundle in features.xml aufgenommen.Apache Camel XML Validator

Hier ist meine Route Definition:

<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> 

ich die folgende Ausnahme in Protokolldatei

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] 

Wenn ich unter Arbeitsmodul 'src/main/resources' dann Kamel sample.xsd Platz zu bekommen Validierungskomponente kann nachsehen. Ich entferne Schrägstrich '/' von vorne

Ich möchte vermeiden, Schema duplizieren und beziehen Sie sich auf es von einem anderen Bündel.

Ich schrieb einen Test Java-Klasse zu prüfen, ob Ressource ladbar ist oder nicht, und seine Lage, die XSD unter JAR-Datei

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

Bitte helfen zu finden, wie XSD-Datei aus verschiedenen Bündeln zu verweisen.

+1

OSGi ist schwer in diesem, müssen Sie exportieren Importieren Sie ein Java-Paket zwischen diesen beiden Bundles und legen Sie die XSD-Datei in dieses Paket, verwenden Sie nicht das Root-Paket –

+0

Vielen Dank für Ihre Antwort. Ich schrieb einen benutzerdefinierten Prozessor, der Xsd aus der Klassenpfad-Ressource ziehen und xml mit diesem Bean-Endpunkt validieren kann. – user2191296

Antwort

1

Sie sollten Ihre XSD-Datei exportieren können, sagen wir, aus Bundle A (A hat die tatsächliche XSD in seinem Jar) und importieren Sie es aus Bundle B (B hat nicht die XSD in seinem Jar). Dies sollte genau so sein wie beim Import/Export von Klassen.

Alternativ könnten Sie versuchen, Paket A zu haben, um die Datei zu lesen und einen OSGI-Dienst zu exportieren, den Bündel B verbrauchen wird. Dann könnte das Problem auftreten, wenn Camel Validator Producer direkt eine InputStream- und keine XSD-Datei akzeptieren kann. Sehen Sie sich org.apache.camel.processor.validation.ValidatingProcessor und ValidatorEndpoint an. Aber in jedem Fall können Sie die Validierung manuell in einem Java-Prozessor in Ihrer Route durchführen.