При использовании @Email валидатора от Hibernate я сразу же столкнулся с проблемой: он не считает ошибочными электронные адреса в которых указан локальный домен. Например, coder@localhost признаётся валидным. Это верно, ведь и на локальную машину можно отправить почту, но в большинстве web-приложений ожидаются адреса в доменах второго и выше уровнях. Что ж, давайте попробуем с этим что-нибудь сделать.
Конечно же мы не первые кто столкнулся с этим: Hibernate validator: @email accepts ask@stackoverflow as valid? Есть даже тикет на по этому поводу в трекере: Add Email annotation parameter to require top level domain names in addresses Но как быть если решение необходимо right now?
В одном из ответов на StackOverflow предлагают взять регулярное выражение, которое hibernate-validator использует для проверки e-mail и подправить его под свои нужды. Выглядит в принципе неплохо, ведь понятно что это временный костыль. Но я решил сделать иначе :)
Copy&paste-ить регулярку мне не хотелось, ведь есть шанс, что баг будут исправлять не скоро (если ещё будут), а вот изменения в regexp могут внести, и появится проблема с рассинхронизацией между моим маленьким fork-ом и upstream-ом.
Предлагаю на суд общественности следующее решение: создать свою аннотацию, которая будет объединять существующую аннотацию @Email с дополнительным регулярным выражением, единственной целью которого будет убедиться, что после собаки домен, как минимум, второго уровня.
Конечно же мы не первые кто столкнулся с этим: Hibernate validator: @email accepts ask@stackoverflow as valid? Есть даже тикет на по этому поводу в трекере: Add Email annotation parameter to require top level domain names in addresses Но как быть если решение необходимо right now?
В одном из ответов на StackOverflow предлагают взять регулярное выражение, которое hibernate-validator использует для проверки e-mail и подправить его под свои нужды. Выглядит в принципе неплохо, ведь понятно что это временный костыль. Но я решил сделать иначе :)
Copy&paste-ить регулярку мне не хотелось, ведь есть шанс, что баг будут исправлять не скоро (если ещё будут), а вот изменения в regexp могут внести, и появится проблема с рассинхронизацией между моим маленьким fork-ом и upstream-ом.
Предлагаю на суд общественности следующее решение: создать свою аннотацию, которая будет объединять существующую аннотацию @Email с дополнительным регулярным выражением, единственной целью которого будет убедиться, что после собаки домен, как минимум, второго уровня.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package ru.mystamps.web.validation.jsr303; | |
import java.lang.annotation.Documented; | |
import java.lang.annotation.Retention; | |
import java.lang.annotation.Target; | |
import javax.validation.Constraint; | |
import javax.validation.Payload; | |
import javax.validation.ReportAsSingleViolation; | |
import javax.validation.constraints.Pattern; | |
import static java.lang.annotation.ElementType.ANNOTATION_TYPE; | |
import static java.lang.annotation.ElementType.FIELD; | |
import static java.lang.annotation.ElementType.METHOD; | |
import static java.lang.annotation.RetentionPolicy.RUNTIME; | |
/** | |
* Workaround implementation for Hibernate's {@code @Email} annotation. | |
* | |
* To require top-level domain I compose {@code @Email} annotation with | |
* {@code @Pattern} where latter just add more strict checking. | |
* | |
* @see <a href="http://stackoverflow.com/q/4459474">Question at StackOverflow</a> | |
* @see <a href="https://hibernate.onjira.com/browse/HVAL-43">Issue in Hibernate's bugtracker</a> | |
* @author Slava Semushin <slava.semushin@gmail.com> | |
* @since 10.01.2012 | |
*/ | |
@org.hibernate.validator.constraints.Email | |
@Pattern(regexp = ".+@.+\\..+") | |
@ReportAsSingleViolation | |
@Target({METHOD, FIELD, ANNOTATION_TYPE}) | |
@Retention(RUNTIME) | |
@Constraint(validatedBy = {}) | |
@Documented | |
public @interface Email { | |
String message() | |
default "{ru.mystamps.web.validation.jsr303.Email.message}"; | |
Class<?>[] groups() default {}; | |
Class<? extends Payload>[] payload() default {}; | |
} |
Комментариев нет:
Отправить комментарий