Hibernate validator не работает

Проблема запуска Hibernate Validator из-за API проверки Bean

Я пытаюсь использовать Hibernate Validator в своем проекте, но он не работает. На следующей строке:

Я получаю следующее исключение:

нашел этот вопрос что похоже на мою проблему. Он описывает свое решение, как

у меня была еще одна банка валидатора бобов в пути к классу. Но не от Мэйвен, я этого не понимал. Удаление этого решило проблему.

это транзитивно тянет зависимость к API проверки Bean (класса javax.проверка: проверка-api: 1.1.0.Финал)

это должно быть причиной этой проблемы, так как возврат к более старой версии (4.3.1.Final) устраняет проблему. Есть ли способ заставить Hibernate не вытаскивать API проверки бобов?

Edit: у меня пытался исключить api проверки javax:

но это, казалось, не имеют никакого эффекта.

5 ответов

попробуйте добавить эту зависимость к вашему pom.в XML

если не рассматривать использование hibernate-validator4.2.0.Final у меня есть это в моей конфигурации, и он работает нормально.

для меня 1.1.0.Окончательная версия пакета javax.утверждение.проверка-api сработала. Так, в пакете javax.утверждение.спи.Интерфейс ConfigurationState 1.1.0.Final имеет метод getParameterNameProvider, который отсутствовал в 1.0.0.Га.

Я добавил приведенную ниже зависимость в pom.в XML

в моем случае я просто удалил hibernate-validator, и он работал .(у меня также была комбинация api проверки и hibernate-validator и пробовала все), или вы можете перейти в свой репозиторий maven->org, а затем удалить папку hibernate и снова перестроить свой проект.. надеюсь, это поможет..

Я подумал, что было бы полезно объяснить, что здесь происходит.

ValidatorFactoryImpl.java:

вы можете найти документацию getParameterNameProvider :

getParameterNameProvider

возвращает имя параметра для этого конфигурация.

возвращает:

имя параметра экземпляра поставщика или null, если не определено

С:

так в чем проблема? Проблема в том, что этот метод существовал не всегда. Он был добавлен в какой-то момент в будущем.

и правило при создании интерфейсов заключается в том, что они установлены в конкретном: вы не должны изменять интерфейс когда-нибудь. Вместо этого валидатор JavaX изменил ConfigurationState интерфейс, и добавил несколько новых методов на протяжении многих лет.

код проверки java передает hiberate устаревший ConfiguationState интерфейс, который не реализует необходимые интерфейсы.

вам нужно убедиться, что javax.утверждение.Утверждение.buildDefaultValidatorFactory обновляется для поддержки версии 1.1.

удаление этой банки javax.validation:validation-api:1.1.0.Final решить мою проблему.

убедитесь, что у вас только одна баночка проверки. Если у нас есть две банки, то они могут конфликтовать, приводя к ошибке.

Источник

Валидация данных в Spring Boot

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

Эту задачу решает Bean Validation. Он интегрирован со Spring и Spring Boot. Hibernate Validator считается эталонной реализацией Bean Validation.

Основы валидации Bean

Для проверки данных используются аннотации над полями класса. Это декларативный подход, который не загрязняет код.

При передаче размеченного таким образом объекта класса в валидатор, происходит проверка на ограничения.

Настройка

Добавьте следующие зависимости в проект:

Валидация в Spring MVC Controller

Сначала данные попадают в контроллер. У входящего HTTP-запроса возможно проверить следующие параметры:

  • тело запроса
  • переменные пути (например, id в /foos/)
  • параметры запроса

Рассмотрим каждый из них подробнее.

Валидация тела запроса

Тело запроса POST и PUT обычно содержит данные в формате JSON. Spring автоматически сопоставляет входящий JSON с объектом Java.

Проверяем соответствует ли входящий Java объект нашим требованиям.

  • Поле numberBetweenOneAndTen должно быть от 1 до 10, включительно.
  • Поле ipAddress должно содержать строку в формате IP-адреса.

Контроллер REST принимает объект Input и выполняет проверку:

Достаточно добавить в параметр input аннотацию @Valid , чтобы сообщить спрингу передать объект Валидатору, прежде чем делать с ним что-либо еще.

Если класс содержит поле с другим классом, который тоже необходимо проверить — это поле необходимо пометить аннотацией Valid.

Исключение MethodArgumentNotValidException выбрасывается, когда объект не проходит проверку. По умолчанию, Spring переведет это исключение в HTTP статус 400.

Проверка переменных пути и параметров запроса

Проверка переменных пути и параметров запроса работает по-другому.

Не проверяются сложные Java-объекты, так как path-переменные и параметры запроса являются примитивными типами, такими как int , или их аналогами: Integer или String .

Вместо аннотации поля класса, как описано выше, добавляют аннотацию ограничения (в данном случае @Min ) непосредственно к параметру метода в контроллере Spring:

Обратите внимание, что необходимо добавить @Validated Spring в контроллер на уровне класса, чтобы сказать Spring проверять ограничения на параметрах метода.

В этом случае аннотация @Validated устанавливается на уровне класса, даже если она присутствует на методах.

В отличии валидации тела запроса, при неудачной проверки параметра вместо метода MethodArgumentNotValidException будет выброшен ConstraintViolationException . По умолчанию последует ответ со статусом HTTP 500 (Internal Server Error), так как Spring не регистрирует обработчик для этого исключения.

Вернем HTTP статус 400, так как клиент предоставил недействительный параметр. Для этого добавляем пользовательский обработчик исключений в контоллер:

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

Валидация в сервисном слое

Можно проверять данные на любых компонентах Spring. Для этого используется комбинация аннотаций @Validated и @Valid .

Аннотация @Validated устанавливается только на уровне класса, так что не ставьте ее на метод в данном случае.

Валидация сущностей JPA

Persistence Layer это последняя линия проверки данных. По умолчанию Spring Data использует Hibernate, который поддерживает Bean Validation из коробки.

Обычно мы не хотим делать проверку так поздно, поскольку это означает, что бизнес-код работал с потенциально невалидными объектами, что может привести к непредвиденным ошибкам.

Допустим, необходимо хранить объекты нашего класса Input в базе данных. Сначала добавляем нужную JPA аннотацию @Entity , а так же поле id :

Когда репозиторий пытается сохранить невалидный Input , чьи аннотации ограничений нарушаются, выбрасывается ConstraintViolationException .

Bean Validation запускается Hibernate только после того как EntityManager вызовет flush.

Чтобы отключить Bean Validation в репозиториях Spring, достаточно установить свойство Spring Boot spring.jpa.properties.javax.persistence.validation.mode равным null .

Валидация конфигурации приложения

Spring Boot аннотация @ConfigurationProperties используется для связывания свойств из application.properties с Java объектом.

Данные из application необходимы для стабильной работы приложения. Bean Validation поможет обнаружить ошибку в этих данных при старте приложения.

Допустим имеется следующий конфигурационный класс:

При попытке запуска с недействительным адресом электронной почты получаем ошибку:

Стандартные ограничения

Каждая аннотация имеет следующие поля:

  • message — указывает на ключ свойства в ValidationMessages.properties , который используется для отправки сообщения в случае нарушения ограничения.
  • groups — позволяет определить, при каких обстоятельствах будет срабатывать эта проверка (о группах проверки поговорим позже).
  • payload — позволяет определить полезную нагрузку, которая будет передаваться сс проверкой.
  • @Constraint — указывает на реализацию интерфейса ConstraintValidator .

Рассмотрим популярные ограничения.

@NotNull и @Null

@NotNull — аннотированный элемент не должен быть null. Принимает любой тип.
@Null — аннотированный элемент должен быть null. Принимает любой тип.

@NotBlank и @NotEmpty

@NotBlank — аннотированный элемент не должен быть null и должен содержать хотя бы один непробельный символ. Принимает CharSequence .
@NotEmpty — аннотированный элемент не должен быть null или пустым. Поддерживаемые типы:

  • CharSequence
  • Collection . Оценивается размер коллекции
  • Map . Оценивается размер мапы
  • Array . Оценивается длина массива

@NotBlank применяется только к строкам и проверяет, что строка не пуста и не состоит только из пробелов.

@NotNull применяется к CharSequence , Collection , Map или Array и проверяет, что объект не равен null . Но при этом он может быть пуст.

@NotEmpty применяется к CharSequence , Collection , Map или Array и проверяет, что он не null имеет размер больше 0.

Аннотация @Size(min=6) пропустит строку состоящую из 6 пробелов и/или символов переноса строки, а @NotBlank не пропустит.

Размер аннотированного элемента должен быть между указанными границами, включая сами границы. null элементы считаются валидными.

  • CharSequence . Оценивается длина последовательности символов
  • Collection . Оценивается размер коллекции
  • Map . Оценивается размер мапы
  • Array . Оценивается длина массива

Добавление пользовательского валидатора

Если имеющихся аннотаций ограничений недостаточно, то создайте новые.

В классе Input использовалось регулярное выражение для проверки того, что строка является IP адресом. Регулярное выражение не является полным: оно позволяет сокеты со значениями больше 255, таким образом «111.111.111.333» будет считаться действительным.

Давайте напишем валидатор, который реализует эту проверку на Java. Потому что как говорится, до решения проблемы регулярным выражением у вас была одна проблема, а теперь стало двe 🙂

Сначала создаем пользовательскую аннотацию @IpAddress :

Реализация валидатора выглядит следующим образом:

Теперь можно использовать аннотацию @IpAddress , как и любую другую аннотацию ограничения.

Принудительный вызов валидации

Для принудительного вызова проверки, без использования Spring Boot, создайте валидатор вручную.

Тем не менее, Spring Boot предоставляет предварительно сконфигурированный экземпляр валидатора. Внедрив этот экземпляр в сервис не придется создавать его вручную.

Когда этот сервис внедряется Spring, в конструктор автоматически вставляется экземпляр валидатора.

Группы валидаций

Некоторые объекты участвуют в разных вариантах использования.

Возьмем типичные операции CRUD: при обновлении и создании, скорее всего, будет использоваться один и тот же класс. Тем не менее, некоторые валидации должны срабатывать при различных обстоятельствах:

  • только перед созданием
  • только перед обновлением
  • или в обоих случаях

Функция Bean Validation, которая позволяет нам внедрять такие правила проверки, называется «Validation Groups».

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

Для нашего примера CRUD определим два маркерных интерфейса OnCreate и OnUpdate :

Затем используем эти интерфейсы с любой аннотацией ограничения:

Это позволит убедиться, что id пуст при создании и заполнен при обновлении.

Spring поддерживает группы проверки только с аннотацией @Validated

Обратите внимание, что аннотация @Validated применяется ко всему классу. Чтобы определить, какая группа проверки активна, она также применяется на уровне метода.

Использование групп проверки может легко стать анти-паттерном. При использовании групп валидации сущность должна знать правила валидации для всех случаев использования (групп), в которых она используется.

Возвращение структурных ответов на ошибки

Когда проверка не удается, лучше вернуть клиенту понятное сообщение об ошибке. Для этого необходимо вернуть структуру данных с сообщением об ошибке для каждой проверки, которая не прошла валидацию.

Сначала нужно определить эту структуру данных. Назовем ее ValidationErrorResponse и она содержит список объектов Violation :

Затем создадим глобальный ControllerAdvice , который обрабатывает все ConstraintViolationExventions , которые пробрасываются до уровня контроллера. Чтобы отлавливать ошибки валидации и для тел запросов, мы также будем работать с MethodArgumentNotValidExceptions :

Здесь информацию о нарушениях из исключений переводится в нашу структуру данных ValidationErrorResponse .

Обратите внимание на аннотацию @ControllerAdvice , которая делает методы обработки исключений глобально доступными для всех контроллеров в контексте приложения.

Источник

Hibernate validator не работает

Шустрый

Профиль
Группа: Участник
Сообщений: 108
Регистрация: 16.4.2007
Где: Spb

Репутация: нет
Всего: нет

Продолжаю тему на счет SpringMVC+Ejb+JPA

Теперь возникла проблема, как отвалидировать ентитю при помощи Hibernate Validator Framework.
Вот ентитя и session stateles bean.

acvilon
Дата 7.8.2009, 16:07 (ссылка) | (нет голосов) Загрузка .
Код
package ru.iamready.action;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.PersistenceContext;
import java.util.List;

import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;

@Stateless(name = «UserLogin», mappedName = «UserLogin»)
public class UserLoginAction implements UserLogin <

@PersistenceContext
private EntityManager entityManager;

private User user;

@Override
public void register(String name, String surname) <
User user = new User();
user.setName(name);
user.setSurname(surname);

ClassValidator validator = new ClassValidator(User.class);
InvalidValue[] errors = validator.getInvalidValues(user);

@Override
public String sayHello(String name) <
return «Fuck you, » + name;
>

@Override
public List getAllUsers() <
Query query = entityManager.createQuery(«select user from User user»);
return query.getResultList();
>
>

import org.hibernate.validator.Length;
import org.hibernate.validator.NotNull;
import org.hibernate.validator.event.JPAValidateListener;

import javax.persistence.*;
import static javax.persistence.GenerationType.IDENTITY;
import java.io.Serializable;

@Entity
@EntityListeners(JPAValidateListener.class )
@Table(name = «testUser», catalog = «ready»)
public class User implements Serializable <
private Integer id;
private String name;
private String surname;

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = «id», unique = true, nullable = false)
public Integer getId() <
return id;
>

public void setId(Integer id) <
this.id = id;
>

@Column(name = «name», nullable = false)
@Length(max = 5)
@NotNull
public String getName() <
return name;
>

public void setName(String name) <
this.name = name;
>

@Column(name = «surname», nullable = false)
@Length(max = 5)
@NotNull
public String getSurname() <
return surname;
>

public void setSurname(String surname) <
this.surname = surname;
>
>

И валидация с помощью этого фреймворка не срабатывает при сохранения и не работает если ее дергать руками, если кто-то сталкивался с этим жду от вас комментов.
А то я уже как сам с собой в этих темах разговариваю(

Присоединённый файл ( Кол-во скачиваний: 6 )
testProject.zip 46,42 Kb

AntonSaburov
Дата 7.8.2009, 17:59 (ссылка) | (нет голосов) Загрузка .

Штурман

Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118

Ну вы батенька уж слишком — ради одного Entity (во всяком случае я только один нашел) нагородили целое EJB приложение. А попроще пример не получается сделать ?

Добавлено @ 18:03
Только что для своего примера подставил ограничение по длине — работает. Просто установил аннотацию Length и подключил JAR. И сразу получил:
org.hibernate.validator.InvalidStateException: validation failed

Что вообщем-то и должно было случиться

Шустрый

Профиль
Группа: Участник
Сообщений: 108
Регистрация: 16.4.2007
Где: Spb

Репутация: нет
Всего: нет

acvilon
Дата 7.8.2009, 18:04 (ссылка) | (нет голосов) Загрузка .
AntonSaburov
Дата 7.8.2009, 18:39 (ссылка) | (нет голосов) Загрузка .

Штурман

Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118

Это он у тебя работающий — а нам же надо для проверки еще базу данных создавать и таблицы Время все-таки.

Попробуй standalone приложение набросать. Посмотреть можно здесь — http://java-course.ru/students/part18.html

Останется только добавить еще hibernate-validator.jar и использовать в каком-нибудь Entity аннотации для валидации.
Ну и запустить.

Шустрый

Профиль
Группа: Участник
Сообщений: 108
Регистрация: 16.4.2007
Где: Spb

Репутация: нет
Всего: нет

Да, люди все ленивые, никто не может скачать проект и написать в командной строке mvn clean install((((

Разобрался в чем проблема. Она заключалась в том, что модель(ентити) лежат в джарники, который кладется в либы и доступен и в ejb модуле и в war модуле. Это весьма странно, сейчас пытаюсь разобраться, как же спроектировать приложение, такое приложение, точнее как его перепроектировать или же как настроить, JPA и Hibernate Validator.

acvilon
Дата 8.8.2009, 20:41 (ссылка) | (нет голосов) Загрузка .

Шустрый

Профиль
Группа: Участник
Сообщений: 108
Регистрация: 16.4.2007
Где: Spb

Репутация: нет
Всего: нет

acvilon
Дата 8.8.2009, 21:15 (ссылка) | (нет голосов) Загрузка .
AntonSaburov
Дата 11.8.2009, 18:19 (ссылка) | (нет голосов) Загрузка .

Штурман

Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 8
Всего: 118

Цитата(acvilon @ 8.8.2009, 20:41 )
написать в командной строке mvn clean install((((

Опытный

Профиль
Группа: Участник
Сообщений: 518
Регистрация: 19.6.2007
Где: Ижевск

Репутация: 2
Всего: 5

serger
Дата 12.8.2009, 07:44 (ссылка) | (нет голосов) Загрузка .
Цитата(AntonSaburov @ 11.8.2009, 18:19 )
Все ставим Maven ? smile

Правила форума «Java»
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс «транслит«, если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка «Пометить как решённый» находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »

[ Время генерации скрипта: 0.1271 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Источник

Читайте также:  Как починить буквы клавиатуре ноутбука
Оцените статью