10.7. validator
验证器根据路由定义上声明的 Input Type
和/或 Output Type
来执行消息的声明验证,该定义声明了预期的消息类型。
只有在 type 声明上的 validate
属性为 true 时才会执行验证。
如果在 Input Type
和/或 Output Type
声明上 validate
属性为 true,则 camel 内部处理器会从 registry 中查找对应的 Validator。
10.7.1. 数据类型格式 复制链接链接已复制到粘贴板!
数据类型的格式是 scheme:name
,其中 scheme 是数据模型的类型,如 java
、xml
或 json
,name 是数据类型名称。
10.7.2. 支持的验证器 复制链接链接已复制到粘贴板!
validator | 描述 |
---|---|
predicate Validator | 使用 Expression 或 Predicate 进行验证 |
端点验证器 | 通过转发到要与验证组件(如 Validation Component 或 Bean Validation 组件)一起使用的 Endpoint 验证。 |
自定义验证器 |
使用自定义验证器类验证。验证器必须是 |
10.7.3. 常见选项 复制链接链接已复制到粘贴板!
所有验证器都必须包含指定要验证的 Data type 的 type 选项。
10.7.4. predicate Validator 选项 复制链接链接已复制到粘贴板!
Name | 描述 |
---|---|
expression | 用于验证的 expression 或 Predicate。 |
指定验证 predicate 的示例:
Java DSL:
validator() .type("csv:CSVOrder") .withExpression(bodyAs(String.class).contains("{name:XOrder}"));
validator()
.type("csv:CSVOrder")
.withExpression(bodyAs(String.class).contains("{name:XOrder}"));
XML DSL:
<predicateValidator Type="csv:CSVOrder"> <simple>${body} contains 'name:XOrder'</simple> </predicateValidator>
<predicateValidator Type="csv:CSVOrder">
<simple>${body} contains 'name:XOrder'</simple>
</predicateValidator>
10.7.5. 端点验证器选项 复制链接链接已复制到粘贴板!
Name | 描述 |
---|---|
ref | 引用端点 ID。 |
uri | 端点 URI。 |
在 Java DSL 中指定端点 URI 的示例:
validator() .type("xml") .withUri("validator:xsd/schema.xsd");
validator()
.type("xml")
.withUri("validator:xsd/schema.xsd");
在 XML DSL 中指定 endpoint ref 的示例:
<validators> <endpointValidator uri="validator:xsd/schema.xsd" type="xml"/> </validators>
<validators>
<endpointValidator uri="validator:xsd/schema.xsd" type="xml"/>
</validators>
Endpoint Validator 将消息转发到指定的端点。在上例中,camel 将消息转发到 validator:
端点,它是一个 Validation 组件。您还可以使用不同的验证组件,如 Bean Validation 组件。
10.7.6. 自定义验证器选项 复制链接链接已复制到粘贴板!
Validator 必须是 org.apache.camel.spi.Validator
的子类
Name | 描述 |
---|---|
ref | 对自定义 Validator Bean ID 的引用。 |
className | 自定义 Validator 类的完全限定类名称。 |
指定自定义 Validator 类的示例:
Java DSL:
validator() .type("json") .withJava(com.example.MyCustomValidator.class);
validator()
.type("json")
.withJava(com.example.MyCustomValidator.class);
XML DSL:
<validators> <customValidator className="com.example.MyCustomValidator" type="json"/> </validators>
<validators>
<customValidator className="com.example.MyCustomValidator" type="json"/>
</validators>
10.7.7. 验证器示例 复制链接链接已复制到粘贴板!
这个示例分为两个部分,第一部分声明 Endpoint Validator 来验证消息。第二部分显示了如何将验证器应用到路由。
10.7.7.1. 第一部分 复制链接链接已复制到粘贴板!
声明 Endpoint Validator,它使用验证器组件从 xml:ABCOrder
验证。
Java DSL:
validator() .type("xml:ABCOrder") .withUri("validator:xsd/schema.xsd");
validator()
.type("xml:ABCOrder")
.withUri("validator:xsd/schema.xsd");
XML DSL:
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <validators> <endpointValidator uri="validator:xsd/schema.xsd" type="xml:ABCOrder"/> </validators> </camelContext>
<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
<validators>
<endpointValidator uri="validator:xsd/schema.xsd" type="xml:ABCOrder"/>
</validators>
</camelContext>
10.7.7.2. 第 II 部分 复制链接链接已复制到粘贴板!
当 direct:abc
端点接收消息时,上面的验证器会应用到以下路由定义。
在 Java DSL 中使用
而不是 inputType,在 XML DSL 中将 inputType 声明上的 inputType
WithValidatevalidate
属性设置为 true
:
Java DSL:
from("direct:abc") .inputTypeWithValidate("xml:ABCOrder") .log("${body}");
from("direct:abc")
.inputTypeWithValidate("xml:ABCOrder")
.log("${body}");
XML DSL: