Существует ли реализация (или сторонняя реализация) перекрестной проверки в Hibernate Validator 4.x? Если нет, то каков самый чистый способ реализации валидатора между полями?
Например, как вы можете использовать API для проверки того, что два свойства бина равны (например, проверка поля пароля соответствует полю проверки пароля).
В аннотациях я бы ожидал что-то вроде:
public class MyBean {
@Size(min=6, max=50)
private String pass;
@Equals(property="pass")
private String passVerify;
}
validation
hibernate-validator
bean-validation
bradhouse
источник
источник
Ответы:
Каждое ограничение поля должно обрабатываться отдельной аннотацией валидатора, или, другими словами, не рекомендуется практиковать проверку аннотации одного поля для проверки других полей; межполевая проверка должна быть сделана на уровне класса. Кроме того, в разделе 2.2 JSR-303 предпочтительным способом выражения нескольких проверок одного типа является использование списка аннотаций. Это позволяет указывать сообщение об ошибке для каждого совпадения.
Например, проверка общей формы:
Аннотация:
Валидатор:
источник
context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()).addNode(secondFieldName).addConstraintViolation().disableDefaultConstraintViolation();
Предоставляет возможность выделения правого поля (если только JSF поддержит его).BeanUtils.getProperty
возвращает строку Пример, вероятно, предназначен для использования,PropertyUtils.getProperty
который возвращает объект.Я предлагаю вам другое возможное решение. Возможно, менее элегантно, но проще!
isValid
Метод вызывается валидатор автоматически.источник
@AssertTrue
методов? Есть какое-то соглашение об именах?Я удивлен, что это не доступно из коробки. Во всяком случае, вот возможное решение.
Я создал валидатор уровня класса, а не уровень поля, как описано в исходном вопросе.
Вот код аннотации:
И сам валидатор:
Обратите внимание, что я использовал MVEL для проверки свойств проверяемого объекта. Это может быть заменено стандартными API отражения или, если это конкретный класс, который вы проверяете, сами методы доступа.
Затем аннотацию @Matches можно использовать в компоненте следующим образом:
Как заявление об отказе от ответственности, я написал это за последние 5 минут, так что я, вероятно, еще не сгладил все ошибки. Я обновлю ответ, если что-то пойдет не так.
источник
С Hibernate Validator 4.1.0. Наконец, я рекомендую использовать @ScriptAssert . Исключение из его JavaDoc:
Примечание: оценка выполняется скриптовым « движком », работающим на Java VM, поэтому на Java «на стороне сервера», а не на «стороне клиента», как указано в некоторых комментариях.
Пример:
или с более коротким псевдонимом и нулевым:
или с Java 7+ нулевым
Objects.equals()
:Тем не менее, нет ничего плохого в настраиваемом решении проверки класса @Matches .
источник
Кросс-поля проверки могут быть сделаны путем создания пользовательских ограничений.
Пример: - Сравнить поля пароля и пароля подтверждения экземпляра пользователя.
CompareStrings
StringComparisonMode
CompareStringsValidator
ConstraintValidatorHelper
пользователь
Тест
Вывод
Message:- [Password, ConfirmPassword] must be equal.
Используя ограничение проверки CompareStrings, мы также можем сравнивать более двух свойств и смешивать любой из четырех методов сравнения строк.
ColorChoice
Тест
Вывод
Message:- Please choose three different colors.
Точно так же мы можем иметь ограничения валидации CompareNumbers, CompareDates и т. Д.
PS Я не тестировал этот код в рабочей среде (хотя я тестировал его в среде разработки), поэтому рассмотрим этот код как Milestone Release. Если вы нашли ошибку, пожалуйста, напишите хороший комментарий. :)
источник
Я попробовал пример Альбертховена (hibernate-validator 4.0.2.GA), и я получил ValidationException: «Аннотированные методы должны следовать соглашению об именах JavaBeans. match () - нет. После того, как я переименовал метод из «match» в «isValid», он работает.
источник
Если вы используете Spring Framework, тогда вы можете использовать язык выражений Spring (SpEL) для этого. Я написал небольшую библиотеку, которая предоставляет валидатор JSR-303, основанный на SpEL, - он позволяет легко проверять кросс-поля! Взгляните на https://github.com/jirutka/validator-spring .
Это проверит длину и равенство полей пароля.
Вы также можете легко изменить это, чтобы проверять поля пароля, только когда они не пусты.
источник
Мне нравится идея от Якуба Jirutka использовать Spring Expression Language. Если вы не хотите добавлять другую библиотеку / зависимость (при условии, что вы уже используете Spring), вот упрощенная реализация его идеи.
Ограничение:
Валидатор:
Подать заявку так:
источник
У меня нет репутации комментировать первый ответ, но я хотел добавить, что я добавил юнит-тесты для победившего ответа и имею следующие замечания:
источник
Очень хорошее решение Bradhouse. Есть ли способ применить аннотацию @Matches к нескольким полям?
РЕДАКТИРОВАТЬ: Вот решение, которое я пришел, чтобы ответить на этот вопрос, я изменил ограничение, чтобы принять массив вместо одного значения:
Код для аннотации:
И реализация:
источник
Вы должны назвать это явно. В приведенном выше примере, Bradhouse дал вам все шаги, чтобы написать пользовательское ограничение.
Добавьте этот код в свой класс абонента.
в приведенном выше случае это будет
источник
Почему бы не попробовать Овал: http://oval.sourceforge.net/
Похоже, он поддерживает OGNL, так что, возможно, вы могли бы сделать это более естественным
источник
Вы, ребята, потрясающие. Действительно потрясающие идеи. Больше всего мне нравятся Альбертховен и Макгин , поэтому я решил объединить обе идеи. И разработать какое-то общее решение для удовлетворения всех случаев. Вот мое предлагаемое решение.
источник
Я сделал небольшую адаптацию в решении Nicko, так что нет необходимости использовать библиотеку Apache Commons BeanUtils и заменить ее решением, уже доступным весной, для тех, кто использует его, поскольку я могу быть проще:
источник
Решение, основанное на вопросе: Как получить доступ к полю, описанному в свойстве аннотации
И как это использовать ...? Как это:
источник