Apache Camel验证输入xml针对XSD的顺序

时间:2016-07-13 05:00:14

标签: validation xsd apache-camel

我必须在 apache-Camel 中针对xsd的传入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和throws异常中的所有元素。当我从xsd中删除特定节点的minoccurs时。这表明验证器被调用,但它只是没有查找xsd中元素的排序。 (注意:我在xsd中使用了xs:sequence)

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>

2 个答案:

答案 0 :(得分:0)

发布的错误消息与发布的XML和XSD中的实际验证问题不匹配。

实际验证问题:

  

[错误] try.xml:7:29:cvc-complex-type.2.4.a:内容无效   从element&#39; ProductID&#39;开始。其中一个{供应商}&#39;是   预期

ProductID移到EID以下,XSD可以解决错误:

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

答案 1 :(得分:0)

我只需要关闭RestBindingMode,它解决了我的问题

router.rest( “/测试”)。ID( “端点TESTING”)。柱()。的 bindingMode(RestBindingMode.off) .TYPE(xyz.class).outType(XYZ的.class).consumes(MIME类型).produces(MIME类型).skipBindingOnErrorCode(真)。为了( “直接:XYZ”);