我必须在 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>
答案 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”);