2016-07-13 6 views
0

Ich muss die Reihenfolge der Elemente von der eingehenden XML-Anfrage gegen xsd in Apache-Camel validieren. Die eingehende Anfrage wäre in den meisten Fällen nur ein Teil der xsd, die als gültige Anfrage betrachtet werden sollte und nur nach der Reihenfolge der Elemente sucht.Apache Camel Validierung Eingang xml Bestellung gegen XSD

Code:

router.rest("/testing").id("ENDPOINT-TESTING").post().type(xyz.class).outType(xyz.class).consumes(MIME_TYPE).produces(MIME_TYPE).skipBindingOnErrorCode(true).to("direct:xyz"); 

router.from("direct:xyz").routeId("handle-xyz-request").to("validator:test.xsd").process("validationProcessor") 
      .bean(xyzService.class, "processXYZ(${body})") ; 

Ausgabe

Als ich validator:test.xsd in der Route-Konfiguration verwenden, es sucht nicht nach Bestellung. Es durchsucht jedoch das Anforderungs-XML nach allen Elementen in der Ausnahme "xsd" und "throws". Wenn ich minoccurs von xsd für einen bestimmten Knoten entferne. Dies zeigt an, dass der Validator aufgerufen wird, aber er sucht einfach nicht nach der Reihenfolge der Elemente in xsd. (Anmerkung: Ich habe verwendet xs: sequence in meinem XSD)

XSD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema attributeFormDefault="unqualified" 
elementFormDefault="qualified" version="1.0" 
xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="y-ML"> 
<xs:complexType> 
<xs:sequence> 
<xs:element name="Header" minOccurs="1"> 
<xs:complexType> 
<xs:sequence> 
    <xs:element name="Product"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Supplier"> 
        <xs:simpleType> 
         <xs:restriction base="xs:string"> 
          <xs:maxLength value="12" /> 
         </xs:restriction> 
        </xs:simpleType> 
       </xs:element> 
       <xs:element type="xs:string" name="ID" /> 
       <xs:element type="xs:string" name="EID" /> 
       <xs:element name="ProductID"> 
        <xs:complexType> 
         <xs:simpleContent> 
          <xs:extension base="xs:string"> 
           <xs:attribute type="xs:string" name="type" /> 
          </xs:extension> 
         </xs:simpleContent> 
        </xs:complexType> 
       </xs:element> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element>       
</xs:sequence> 
</xs:complexType> 
</xs:element> 
<xs:element name="Provisioning" minOccurs="0"> 
<xs:complexType> 
<xs:sequence> 
    <xs:element name="ServiceFlag" maxOccurs="unbounded" 
     minOccurs="0"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element type="xs:string" name="Service" /> 
       <xs:element type="xs:string" name="FlagValue" /> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element type="xs:string" name="Brand" /> 
</xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:sequence> 
<xs:attribute type="xs:float" name="version" /> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

Anfrage xml

Haben die Bestellung von Element ProductID geändert, die validiert bekommen sollte und werfen ein Ausnahme.

<y-ML version="1.0"> 
    <Header> 
     <Product> 
      <ProductID type="PID">658932145</ProductID> 
      <Supplier>Samsung</Supplier> 
      <ID>213517</ID> 
      <EID>SEDT7888125</EID> 
     </Product>  
    </Header> 
</y-ML> 
+0

Schreiben Sie eine [mcve] (die XML und XSD enthält), die das Problem aufweist. Vielen Dank. – kjhughes

+0

@kjhughes, haben die xsd- und xml-Details hinzugefügt. Jeder Vorschlag für eine mögliche Lösung wird geschätzt. – JavaDev

Antwort

0

Die angegebene Fehlermeldung stimmt nicht mit dem tatsächlichen Validierungsproblem in der gebuchten XML- und XSD-Datei überein.

Actual Validierung Problem:

[Error] try.xml:7:29: cvc-complex-type.2.4.a: Invalid content was found starting with element 'ProductID'. One of '{Supplier}' is expected.

bewegen ProductID unter EID wo die XSD hat er den Fehler behebt:

<y-ML version="1.0"> 
    <Header> 
    <Product> 
     <Supplier>Samsung</Supplier> 
     <ID>213517</ID> 
     <EID>SEDT7888125</EID> 
     <ProductID type="PID">658932145</ProductID> 
    </Product>  
    </Header> 
</y-ML> 
+0

Das ist die Ausnahme, die ich erwarte zu sehen, aber mit dem oben in meinem Beitrag geposteten Routencode bekomme ich keine Ausnahme, – JavaDev

+0

Ich dachte, Sie sagten, dass Sie den * falschen * Fehler (in Ihrer Frage gezeigt) nicht haben *kein Fehler. – kjhughes

+0

Es tut mir leid, wenn es irreführend war, ich hatte das nur eingefügt, um anzuzeigen, dass die Validierung für fehlende Elemente stattfindet, aber keine Ausnahme für ungültige Reihenfolge auslöst. – JavaDev

0

Ich hatte einfach das RestBindingMode auszuschalten, die gelöst meine Ausgabe

router.rest ("/ Testen"). Id ("ENDPOINT-TESTING"). Post(). bindingMode (RestBindingMode.off) .type (xyz.class) .outType (xyz.class) .consumes (mimetype) .produces (mimetype) .skipBindingOnErrorCode (true) .to ("direct: xyz");