2016-07-13 6 views
0

xsdに対して受信XMLリクエストの要素の順序をapache-Camelに検証する必要があります。ほとんどの場合、着信要求はxsdの一部にすぎません。これは有効な要求とみなされ、要素の順序付けを探します。Apache Camel入力xmlをXSDに対して検証する

コード:

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})") ; 

問題

私はルート設定でvalidator:test.xsdを使用すると、注文を探していません。ただし、要求xmlをスキャンしてxsdのすべての要素が存在するかどうかを調べ、例外をスローします。特定のノードのxsdからminoccurを削除すると。これはバリデーターが呼び出されたことを示しますが、xsdの要素の順序付けは検索されません。 (注:私は、xs使用している:私の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> 

要求XML

は持っているが、検証とスローを取得すべき要素のProductIDの順序を変更しました例外。

<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

問題を示す[mcve](XMLとXSDを含む)を投稿してください。ありがとう。 – kjhughes

+0

@kjhughes、xsdとxmlの詳細を追加しました。可能な解決策に関する提案は高く評価されます。 – JavaDev

答えて

0

投稿されたエラーメッセージが、投稿されたXMLおよびXSDの実際の検証の問題と一致しません。

実際の検証問題: XSDは、それがエラーを解決していEID以下ProductID移動

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

<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

これは私が見たいと思う例外ですが、私のポストに上に掲載されたルートコードでは、例外がスローされません。 – JavaDev

+0

私はあなたが*間違った*エラー*いいえ*エラー。 – kjhughes

+0

誤解を招いて申し訳ありませんが、私は要素の欠落に対して検証が行われたことを示していますが、無効な注文については例外をスローしません。 – JavaDev

0

私は解決RestBindingModeをオフにする必要がありましたが私の問題

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

関連する問題