Bean Validator

Поддерживается только производитель

Компонент Validator выполняет проверку бинов (Bean-компонентов) тела сообщения, используя API Java Bean Validation ( JSR 303 (opens in a new tab) ). Camel использует эталонную реализацию -- Hibernate Validator (opens in a new tab) .

Пользователям Maven необходимо добавить следующую зависимость для pom.xmlэтого компонента:

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-bean-validator</artifactId>
    <version>x.y.z</version>
    <!-- use the same version as your Camel core version -->
</dependency>

URI format

bean-validator:label[?options]

Где label -- это произвольное текстовое значение, описывающее конечную точку. Вы можете добавить параметры запроса к URI в следующем формате:?option=value&option=value&…​

Configuring Options

Компоненты Camel настраиваются на двух отдельных уровнях:

  • уровень компонентов

  • уровень конечной точки

Configuring Component Options

На уровне компонентов задаются общие и общие конфигурации, которые затем наследуются конечными точками. Это самый высокий уровень конфигурации.

Например, компонент может иметь настройки безопасности, учетные данные для аутентификации, URL-адреса для сетевого подключения и т. д.

У некоторых компонентов всего несколько параметров, а у других -- много. Поскольку компоненты обычно имеют предустановленные значения по умолчанию, которые широко используются, зачастую вам может потребоваться настроить лишь несколько параметров компонента, а то и вовсе ни одного.

Вы можете настроить компоненты, используя:

  • Компонент DSL (opens in a new tab) .

  • в файле конфигурации ( application.propertiesфайлы *.yaml, и т.д.).

  • непосредственно в коде Java.

Configuring Endpoint Options

Настройка конечных точек обычно занимает больше времени, поскольку у них есть множество параметров. Эти параметры помогают вам настроить функции конечной точки. Параметры также классифицируются по тому, используется ли конечная точка как потребитель ( от ), как производитель ( от ) или и то, и другое.

Конечные точки чаще всего настраиваются непосредственно в URI конечной точки в виде параметров пути и запроса . Вы также можете использовать Endpoint DSL (opens in a new tab) и DataFormat DSL (opens in a new tab) в качестве типобезопасного способа настройки конечных точек и форматов данных в Java.

Хорошей практикой при настройке параметров является использование заполнителей свойств (opens in a new tab) .

Заполнители свойств обеспечивают несколько преимуществ:

  • Они помогают предотвратить использование жестко запрограммированных URL-адресов, номеров портов, конфиденциальной информации и других настроек.

  • Они позволяют вынести конфигурацию за пределы кода.

  • Они помогают коду стать более гибким и пригодным для повторного использования.

В следующих двух разделах перечислены все параметры, сначала для компонента, а затем для конечной точки.

Component Options

Компонент Bean Validator поддерживает 8 опций, которые перечислены ниже.

ignoreXmlConfiguration (producer)

  • Игнорировать ли данные из файла META-INF/validation.xml.

  • По умолчанию: false

  • Тип: boolean

lazyStartProducer (producer)

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

autowiredEnabled (advanced)

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • По умолчанию: true

  • Тип: boolean

constraintValidatorFactory (advanced)

  • Для использования пользовательского ConstraintValidatorFactory.

  • По умолчанию:

  • Тип: ConstraintValidatorFactory

  • Тип: messageInterpolator (advanced)

  • Для использования пользовательского MessageInterpolator.

  • MessageInterpolator

traversableResolver (advanced)

  • Для использования пользовательского TraversableResolver.

  • По умолчанию:

  • Тип: TraversableResolver

  • Тип: validationProviderResolver (advanced)

  • Для использования пользовательского ValidationProviderResolver.

  • ValidationProviderResolver

validatorFactory (advanced)

  • Autowired Для использования пользовательского ValidatorFactory.

  • По умолчанию:

  • Тип: ValidatorFactory

Endpoint Options

Конечная точка Bean Validator настраивается с использованием синтаксиса URI:

bean-validator:label

Со следующими параметрами пути и запроса :

Path Parameters (1 parameters)

  • Тип: label (producer)

  • Обязательно Где label -- произвольное текстовое значение, описывающее конечную точку.

  • String

Query Parameters (8 parameters)

group (producer)

  • Использовать пользовательскую группу проверки.

  • По умолчанию: jakarta.validation.groups.Default

  • Тип: String

ignoreXmlConfiguration (producer)

  • Игнорировать ли данные из файла META-INF/validation.xml.

  • По умолчанию: false

  • Тип: boolean

lazyStartProducer (producer (advanced))

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: boolean

constraintValidatorFactory (advanced)

  • Для использования пользовательского ConstraintValidatorFactory.

  • По умолчанию:

  • Тип: ConstraintValidatorFactory

  • Тип: messageInterpolator (advanced)

  • Для использования пользовательского MessageInterpolator.

  • MessageInterpolator

traversableResolver (advanced)

  • Для использования пользовательского TraversableResolver.

  • По умолчанию:

  • Тип: TraversableResolver

  • Тип: validationProviderResolver (advanced)

  • Для использования пользовательского ValidationProviderResolver.

  • ValidationProviderResolver

validatorFactory (advanced)

  • Для использования пользовательского ValidatorFactory.

  • По умолчанию:

  • Тип: ValidatorFactory

Using HibernateValidationProviderResolver

  • Java

from("direct:test"). to("bean-validator://ValidationProviderResolverTest?validationProviderResolver=#myValidationProviderResolver");

  • XML
<bean id="myValidationProviderResolver" class="org.apache.camel.component.bean.validator.HibernateValidationProviderResolver"/>

Example

Предположим, у нас есть Java-компонент со следующими аннотациями:

Car.java

public class Car {

    @NotNull
    private String manufacturer;

    @NotNull
    @Size(min = 5, max = 14, groups = OptionalChecks.class)
    private String licensePlate;

    // getter and setter
}

и определение интерфейса для нашей пользовательской группы проверки

OptionalChecks.java

при использовании следующего маршрута Camel будут проверены только ограничения @NotNull для атрибутов (Camel использует группу по умолчанию ).manufacturer``licensePlate``jakarta.validation.groups.Default

from("direct:start")
.to("bean-validator://x")
.to("mock:end")

Если вы хотите проверить ограничения группы OptionalChecks, вам нужно определить маршрут следующим образом:

from("direct:start")
.to("bean-validator://x?group=OptionalChecks")
.to("mock:end")

Если вы хотите проверить ограничения обеих групп, вам сначала нужно определить новый интерфейс:

AllChecks.java

@GroupSequence({Default.class, OptionalChecks.class})
public interface AllChecks {
}

И тогда ваше определение маршрута должно выглядеть так:

from("direct:start")
.to("bean-validator://x?group=AllChecks")
.to("mock:end")

А если вам нужно предоставить собственный интерполятор сообщений, проходимый распознаватель и фабрику валидаторов ограничений, вам придется написать такой маршрут:

  • Java

from("direct:start") .to("bean-validator://x?group=AllChecks&messageInterpolator=#myMessageInterpolator &traversableResolver=#myTraversableResolver&constraintValidatorFactory=#myConstraintValidatorFactory") .to("mock:end")

  • XML

<span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">bean</span> <span class="hljs-attr" style="color: teal;">id</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"myMessageInterpolator"</span> <span class="hljs-attr" style="color: teal;">class</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"my.ConstraintValidatorFactory"</span> /&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">bean</span> <span class="hljs-attr" style="color: teal;">id</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"myTraversableResolver"</span> <span class="hljs-attr" style="color: teal;">class</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"my.TraversableResolver"</span> /&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">bean</span> <span class="hljs-attr" style="color: teal;">id</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"myConstraintValidatorFactory"</span> <span class="hljs-attr" style="color: teal;">class</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"my.ConstraintValidatorFactory"</span> /&gt;</span>

Ограничения также можно описывать в формате XML, а не в виде аннотаций Java. В этом случае вам необходимо предоставить файлы META-INF/validation.xml, constraints-car.xmlкоторые могут выглядеть примерно так:

  • validation.xml
<validation-config
        xmlns="https://jakarta.ee/xml/ns/validation/configuration"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="https://jakarta.ee/xml/ns/validation/configuration https://jakarta.ee/xml/ns/validation/validation-configuration-3.0.xsd"
        version="3.0">
 
    <default-provider>org.hibernate.validator.HibernateValidator</default-provider>
    <message-interpolator>org.hibernate.validator.engine.ResourceBundleMessageInterpolator</message-interpolator>
    <traversable-resolver>org.hibernate.validator.engine.resolver.DefaultTraversableResolver</traversable-resolver>
    <constraint-validator-factory>org.hibernate.validator.engine.ConstraintValidatorFactoryImpl</constraint-validator-factory>
    <constraint-mapping>/constraints-car.xml</constraint-mapping>
 
</validation-config>
  • constraints-car.xml

<span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">constraint-mappings</span> <span class="hljs-attr" style="color: teal;">xmlns</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"<a href="https://jakarta.ee/xml/ns/validation/mapping">https://jakarta.ee/xml/ns/validation/mapping</a>"</span> <span class="hljs-attr" style="color: teal;">xmlns:xsi</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"</span> <span class="hljs-attr" style="color: teal;">xsi:schemaLocation</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"<a href="https://jakarta.ee/xml/ns/validation/mapping">https://jakarta.ee/xml/ns/validation/mapping</a> <a href="https://jakarta.ee/xml/ns/validation/validation-mapping-3.0.xsd">https://jakarta.ee/xml/ns/validation/validation-mapping-3.0.xsd</a>"</span> <span class="hljs-attr" style="color: teal;">version</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"3.0"</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">default-package</span>&gt;</span><span style="color: rgb(79,81,174);">org.apache.camel.component.bean.validator</span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">default-package</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">bean</span> <span class="hljs-attr" style="color: teal;">class</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"CarWithoutAnnotations"</span> <span class="hljs-attr" style="color: teal;">ignore-annotations</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"true"</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">field</span> <span class="hljs-attr" style="color: teal;">name</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"manufacturer"</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">constraint</span> <span class="hljs-attr" style="color: teal;">annotation</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"jakarta.validation.constraints.NotNull"</span> /&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">field</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">field</span> <span class="hljs-attr" style="color: teal;">name</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"licensePlate"</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">constraint</span> <span class="hljs-attr" style="color: teal;">annotation</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"jakarta.validation.constraints.NotNull"</span> /&gt;</span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">constraint</span> <span class="hljs-attr" style="color: teal;">annotation</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"jakarta.validation.constraints.Size"</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">groups</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">value</span>&gt;</span><span style="color: rgb(79,81,174);">org.apache.camel.component.bean.validator.OptionalChecks</span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">value</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">groups</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">element</span> <span class="hljs-attr" style="color: teal;">name</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"min"</span>&gt;</span><span style="color: rgb(79,81,174);">5</span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">element</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;<span class="hljs-name" style="color: navy;">element</span> <span class="hljs-attr" style="color: teal;">name</span>=<span class="hljs-string" style="color: rgb(221,17,68);">"max"</span>&gt;</span><span style="color: rgb(79,81,174);">14</span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">element</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">constraint</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">field</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">bean</span>&gt;</span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;">&lt;/<span class="hljs-name" style="color: navy;">constraint-mappings</span>&gt;</span>

Вот синтаксис XML для примера определения маршрута, где OrderedChecks может быть https://github.com/apache/camel/blob/main/components/camel-bean-validator/src/test/java/org/apache/camel/component/bean/validator/OrderedChecks.java (opens in a new tab)

Обратите внимание, что тело должно включать экземпляр класса для проверки.

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

    <camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="direct:start"/>
            <to uri="bean-validator://x?group=org.apache.camel.component.bean.validator.OrderedChecks"/>
        </route>
    </camelContext>
</beans>

Spring Boot Auto-Configuration

При использовании bean-validator с Spring Boot обязательно используйте следующую зависимость Maven для поддержки автоматической настройки:

<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-bean-validator-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>

Компонент поддерживает 9 опций, которые перечислены ниже.

  • Тип: camel.component.bean-validator.autowired-enabled

  • Включено ли автоматическое связывание. Это используется для параметров автоматического связывания (параметр должен быть помечен как autowired) путём поиска в реестре экземпляра соответствующего типа, который затем настраивается в компоненте. Это может использоваться для автоматической настройки источников данных JDBC, фабрик JMS-подключений, клиентов AWS и т. д.

  • true

  • Boolean

camel.component.bean-validator.constraint-validator-factory

  • Для использования пользовательской фабрики валидаторов ограничений (ConstraintValidatorFactory) можно использовать тип jakarta.validation.ConstraintValidatorFactory.

  • По умолчанию:

  • Тип: ConstraintValidatorFactory

  • Тип: camel.component.bean-validator.enabled

  • Включить ли автоматическую настройку компонента bean-validator. По умолчанию эта функция включена.

  • Boolean

camel.component.bean-validator.ignore-xml-configuration

  • Игнорировать ли данные из файла META-INF/validation.xml.

  • По умолчанию: false

  • Тип: Boolean

camel.component.bean-validator.lazy-start-producer

  • Следует ли запускать производитель в режиме ленивого запуска (при первом сообщении). Запуск в режиме ленивого запуска позволяет разрешить запуск CamelContext и маршрутов в ситуациях, когда производитель может выйти из строя при запуске, что приведет к сбою запуска маршрута. Отложив запуск в режим ленивого запуска, можно обработать сбой запуска во время маршрутизации сообщений с помощью обработчиков ошибок маршрутизации Camel. Имейте в виду, что после обработки первого сообщения создание и запуск производителя могут занять некоторое время и увеличить общее время обработки.

  • По умолчанию: false

  • Тип: Boolean

camel.component.bean-validator.message-interpolator

  • Для использования пользовательского MessageInterpolator. Этот параметр относится к типу jakarta.validation.MessageInterpolator.

  • По умолчанию:

  • Тип: MessageInterpolator

  • Тип: camel.component.bean-validator.traversable-resolver

  • Для использования пользовательского TraversableResolver. Этот параметр относится к типу jakarta.validation.TraversableResolver.

  • TraversableResolver

camel.component.bean-validator.validation-provider-resolver

  • Для использования пользовательского ValidationProviderResolver. Этот параметр имеет тип jakarta.validation.ValidationProviderResolver.

  • По умолчанию:

  • Тип: ValidationProviderResolver

  • Тип: camel.component.bean-validator.validator-factory

  • Для использования пользовательской фабрики валидаторов (ValidatorFactory) можно использовать тип jakarta.validation.ValidatorFactory.

  • ValidatorFactory