10.7. 验证器

验证器会根据声明的输入类型和/或输出类型对声明性消息执行声明性验证,该定义声明了预期的消息类型。

注意

只有在 type 声明中的 validate 属性为 true 时才执行验证。

如果在输入类型和/或输出类型声明上 验证 属性为 true,则 camel 内部处理器会从 registry 查找对应的验证器。

10.7.1. 数据类型格式

数据类型格式为 scheme:name,其中 scheme 是 Java、xmljsonname 是数据类型名称。

10.7.2. 支持的验证器

验证器描述

predicate Validator

使用 Expression 或 Predicate 进行验证

endpoint Validator

通过转发到与验证组件(如 Validation 组件或 Bean Validation 组件)搭配使用的 Endpoint 验证组件进行验证。

自定义验证器

使用自定义验证器类进行验证。验证器必须是 org.apache.camel.spi.Validator的子类

10.7.3. 常见选项

所有验证器都必须包括指定 Data type to validate 的 type 选项。

10.7.4. predicate 验证器选项

名称描述

expression

用于验证的表达式或优先级。

指定验证 predicate 的示例:

Java DSL:

validator()
    .type("csv:CSVOrder")
    .withExpression(bodyAs(String.class).contains("{name:XOrder}"));

XML DSL:

<predicateValidator Type="csv:CSVOrder">
    <simple>${body} contains 'name:XOrder'</simple>
</predicateValidator>

10.7.5. 端点验证选项

名称描述

ref

引用端点 ID。

uri

端点 URI.

在 Java DSL 中指定端点 URI 的示例:

validator()
    .type("xml")
    .withUri("validator:xsd/schema.xsd");

在 XML DSL 中指定端点 ref 的示例:

<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的子类

名称描述

ref

引用自定义验证器 bean ID。

className

自定义验证类类的全限定类名称。

指定自定义验证类的示例:

Java DSL:

validator()
    .type("json")
    .withJava(com.example.MyCustomValidator.class);

XML DSL:

<validators>
<customValidator className="com.example.MyCustomValidator" type="json"/>
</validators>

10.7.7. 验证器示例

此示例分为两个部分,第一部分声明了用于验证消息的 Endpoint Validator。第二部分显示验证器如何应用到路由。

10.7.7.1. 第 I 部分

声明使用验证器组件从 xml:ABCOrder 进行身份验证的 Endpoint Validator。

Java DSL:

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>

10.7.7.2. 第 II 部分

direct:abc 端点收到消息时,上述验证器会应用到以下路由定义。

注意

inputTypeWithValidate 被使用在 Java DSL 中而不是 inputType,在 XML DSL 中将 inputType 声明中的 verify 属性设置为 true

Java DSL:

from("direct:abc")
    .inputTypeWithValidate("xml:ABCOrder")
    .log("${body}");

XML DSL:

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="direct:abc"/>
        <inputType urn="xml:ABCOrder" validate="true"/>
        <log message="${body}"/>
    </route>
</camelContext>