Javax.validation.constraints.Email в SpringBoot

У меня есть bean-компонент с этой проверкой:

@Email(message = "Email is not valid", regexp = "{(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])}")
@NotEmpty(message = "Email cannot be empty")
private String email;

когда электронная почта пуста, сообщение в порядке, но когда я ввожу этот текст

perisava.util.Random@1d7f0036

ошибка не отображается

Вы можете подтвердить, что получили ConstraintViolationException?

silentsudo 19.12.2020 15:49

Нет, у меня ничего не получается :-(

en Peris 19.12.2020 16:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
5
2
24 880
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

javax.validation.constraints.Email аннотация зависит от Jakarta Bean Validation providers для проверки. Hibernate Validator — единственный совместимый валидатор для этого. По умолчанию hibernate vaildator сопоставляет адрес электронной почты с регулярным выражением .*, если только вы сами не предоставите регулярное выражение. Исходный код валидатора электронной почты Hibernate находится здесь.

Одним из решений является предоставление собственного регулярного выражения электронной почты.

@Email(message = "Email is not valid", regexp = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$")
@NotEmpty(message = "Email cannot be empty")
private String email;

Официальный стандарт — RFC 5322. Но он не охватывает все случаи для современных электронных писем. Больше решений вы можете найти здесь. Даже тогда регулярное выражение будет зависеть от вас.

Я пробовал с этой ошибкой: java.util.regex.PatternSyntaxException: недопустимое повторение {(?:[a-z0-9!#$%&'+/=?^_{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_{|}~-‌​]+ )*|"(?:[\x01-\x08\‌​x0b\x0c\x0e-\x1f\x21‌​\x23-\x5b\x5d-\x7f]|‌​\[\x01-\x09\x0b \‌​x0c\x0e-\x7f])")@(?:‌​(?:[a-z0-9](?:[a-z0-‌​9-]*[a-z0-9] )?\.)+[a‌​-z0-9](?:[a-z0-9-]*[‌​a-z0-9])?|[(?:(?‌​:25[0 -5]|2[0–4][0–9]‌​|[01]?[0–9][0–9]?)\.‌​){3}(?:25[0–5] ]|2[0-4‌][0-9]|[01]?[0-9][0-‌​9]?|[a-z0-9-]*[a-z0-‌​9 ]:(?:[\x01-\x08\x0b‌​\x0c\x0e-\x1f\x21-\x‌​5a\x53-\x7f]|\[\‌​x01-\x09\x0b\x0c\x0e‌ ​-\x7f])+)])} в java.base/java.util.regex.Pattern.error(Pattern.java:2010)

en Peris 19.12.2020 17:21

Я пробовал решение, и оно сработало для меня :(. Я добавляю свое решение. Я использую java 8 с весенней загрузкой 2.3.4

Shawrup 19.12.2020 17:34

Я пытался [email protected], но не получилось. Это может быть действующий адрес электронной почты.

jumping_monkey 15.02.2023 08:06

Эта проблема решается просмотром исходного кода. Аннотация @Email имеет атрибут regexp(), значение по умолчанию — '.*'. И это соответствует введенным вами символам, вы можете написать свое собственное регулярное выражение

Регулярное выражение в принятом ответе трудно читать, и оно не работает для варианта использования, который я тестировал. Вот еще одно регулярное выражение, которое вы можете использовать:

private static final Pattern EMAIL = Pattern.compile("^[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,6}$", Pattern.CASE_INSENSITIVE);

public static boolean isEmail(String s) {
    return EMAIL.matcher(s).matches();
}

Это проще и работает хорошо.

Другие вопросы по теме