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;"><<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> /></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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> /></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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> /></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;"><<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>></span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<span class="hljs-name" style="color: navy;">default-package</span>></span><span style="color: rgb(79,81,174);">org.apache.camel.component.bean.validator</span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">default-package</span>></span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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> /></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">field</span>></span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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> /></span><span style="color: rgb(79,81,174);"> </span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<span class="hljs-name" style="color: navy;">groups</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<span class="hljs-name" style="color: navy;">value</span>></span><span style="color: rgb(79,81,174);">org.apache.camel.component.bean.validator.OptionalChecks</span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">value</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">groups</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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>></span><span style="color: rgb(79,81,174);">5</span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">element</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"><<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>></span><span style="color: rgb(79,81,174);">14</span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">element</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">constraint</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">field</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">bean</span>></span><span style="color: rgb(79,81,174);"> </span><span class="hljs-tag" style="color: navy;"></<span class="hljs-name" style="color: navy;">constraint-mappings</span>></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