У меня есть 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
ошибка не отображается
Нет, у меня ничего не получается :-(




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-\x5a\x53-\x7f]|\[\x01-\x09\x0b\x0c\x0e -\x7f])+)])} в java.base/java.util.regex.Pattern.error(Pattern.java:2010)
Я пробовал решение, и оно сработало для меня :(. Я добавляю свое решение. Я использую java 8 с весенней загрузкой 2.3.4
Я пытался [email protected], но не получилось. Это может быть действующий адрес электронной почты.
Эта проблема решается просмотром исходного кода. Аннотация @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();
}
Это проще и работает хорошо.
Вы можете подтвердить, что получили
ConstraintViolationException?