Hibernate Validator: @Email akzeptiert fragen @ Stackoverflow als gültig?
-
10-10-2019 - |
Frage
Ich bin mit der @Email
Annotation eine E-Mail-Adresse zu bestätigen.
Die Frage, die ich habe, ist, dass es Dinge wie ask@stackoverflow
eine gültige E-Mail-Adresse zu akzeptieren.
Ich denke, das liegt daran, dass sie Unterstützung Intranet-Adressen möchten, aber ich kann nicht scheinen, eine Flagge zu finden, damit es Prüfung für eine Verlängerung der Fall ist.
Muss ich wirklich brauchen, um Schalter zu @Pattern
(und alle Empfehlungen für eine E-Mail-Muster, das flexibel ist) oder bin ich etwas fehlt?
Lösung
Eigentlich @Email
von Hibernate Validator uses regExp intern . Sie können Ihre eigene Beschränkung auf der Grundlage dieses regexp leicht definieren, geändert, wie Sie (die +
am Ende DOMAIN
beachten) muss:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {})
@Pattern(regexp = Constants.PATTERN, flags = Pattern.Flag.CASE_INSENSITIVE)
public @interface EmailWithTld {
String message() default "Wrong email";
Class<?>[] groups() default { };
Class<? extends Payload>[] payload() default { };
}
interface Constants {
static final String ATOM = "[a-z0-9!#$%&'*+/=?^_`{|}~-]";
static final String DOMAIN = "(" + ATOM + "+(\\." + ATOM + "+)+";
static final String IP_DOMAIN = "\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]";
static final String PATTERN =
"^" + ATOM + "+(\\." + ATOM + "+)*@"
+ DOMAIN
+ "|"
+ IP_DOMAIN
+ ")$";
}
Andere Tipps
Sie können auch verwenden Constraint Zusammensetzung als Behelfslösung. Im Beispiel unten, verlasse ich mich auf dem @Email
Validator die Haupt Validierung zu tun, und eine @Pattern
Validator hinzufügen, um sicherzustellen, ist die Adresse in Form von x@y.z
(Ich empfehle, nicht nur die @Pattern
unten für regelmäßige E-Mail-Validierung verwenden)
@Email(message="Please provide a valid email address")
@Pattern(regexp=".+@.+\\..+", message="Please provide a valid email address")
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented
public @interface ExtendedEmailValidator {
String message() default "Please provide a valid email address";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Eigentlich E-Mail-Adressen Validierung ist wirklich komplex. Es ist nicht möglich zu überprüfen, ob eine E-Mail-Adresse ist sowohl syntaktisch korrekt und Adressen der Empfänger in einer Anmerkung. Die @Email
Annotation ist eine nützliche minimale Kontrolle, die nicht von dem Problem der falschen Negativ leidet.
Der nächste Schritt bei der Validierung soll eine E-Mail mit einer Herausforderung wird, sendet, dass der Benutzer zu etablieren abgeschlossen hat, dass der Benutzer Zugriff hat an die E-Mail-Adresse.
Es ist besser zu sein, ein paar Fehlalarme in Schritt 1 übernehmen und einige ungültige E-Mail-Adressen zulassen als passieren gültige Benutzer abzulehnen. Wenn Sie zusätzliche Regeln anwenden möchten, können Sie mehr Kontrollen hinzufügen, aber wirklich vorsichtig sein, was Sie davon ausgehen, eine Anforderung an eine gültige E-Mail-Adresse zu sein. Zum Beispiel gibt es nichts in dem RFCs, dass diktiert, dass i@nl
würde unwirksam sein, weil nl
eine eingetragene Land Top-Level-Domain ist.
Hier ist ein javax.validation E-Mail-Validator mit Apache Commons Validator
public class CommonsEmailValidator implements ConstraintValidator<Email, String> {
private static final boolean ALLOW_LOCAL = false;
private EmailValidator realValidator = EmailValidator.getInstance(ALLOW_LOCAL);
@Override
public void initialize(Email email) {
}
@Override
public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
if( s == null ) return true;
return realValidator.isValid(s);
}
}
Und die Anmerkung:
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {CommonsEmailValidator.class})
@Documented
@ReportAsSingleViolation
public @interface Email {
String message() default "{org.hibernate.validator.constraints.Email.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface List {
Email[] value();
}
}
Offensichtlich bin ich zu spät zur Party, noch ich auf diese Frage bin Antwort,
Warum kann man @Pattern Annotation mit regulären Ausdrücken in unserer Validation Klasse wie folgt verwenden
public Class Sigunup {
@NotNull
@NotEmpty
@Pattern((regexp="[A-Za-z0-9._%-+]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}")
private String email;
}
Es ist einfacher.
Die Einschränkung Zusammensetzung Lösung funktioniert nicht. Wenn E-Mail in Verbindung mit Mustern verwendet wird, wird der E-Mail-Regex in einem höheren Priorität gehalten. Ich glaube, das liegt daran, dass die E-Mail-Anmerkung ein paar Muster Attribute überschreibt, nämlich Flaggen und regexp (der Schlüssel eines hier) Wenn ich @Email
entfernen, wird nur dann der @Pattern
reguläre Ausdruck in Validierungen gilt.
/**
* @return an additional regular expression the annotated string must match. The default is any string ('.*')
*/
@OverridesAttribute(constraint = Pattern.class, name = "regexp") String regexp() default ".*";
/**
* @return used in combination with {@link #regexp()} in order to specify a regular expression option
*/
@OverridesAttribute(constraint = Pattern.class, name = "flags") Pattern.Flag[] flags() default { };
Sie können E-Mail-regexp verwenden, auch darauf achten, dass die Validierung nicht ausfällt, wenn die E-Mail leer ist.
@Email(regexp = ".+@.+\\..+|")
@Target({METHOD, FIELD, ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented
public @interface ExtendedEmail {
@OverridesAttribute(constraint = Email.class, name = "message")
String message() default "{javax.validation.constraints.Email.message}";
@OverridesAttribute(constraint = Email.class, name = "groups")
Class<?>[] groups() default {};
@OverridesAttribute(constraint = Email.class, name = "payload")
Class<? extends Payload>[] payload() default {};
}
Wenn Sie die obige Lösung versuchen werden https://stackoverflow.com/a/12515543/258544 add die @ReportAsSingleViolation
in der Anmerkung defination, auf diese Weise Sie beide Validierungsnachricht (eine von @Email
und einer aus @Pattern
) zu vermeiden, da es eine zusammengesetzt Anmerkung ist:
@Email(message="Please provide a valid email address")
@Pattern(regexp=".+@.+\\..+", message="Please provide a valid email address")
@Target( { METHOD, FIELD, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = {})
@Documented
@ReportAsSingleViolation
Von @interface ReportAsSingleViolation
javax.validation: validation-api: 1.1.0.Final) Anmerkung Definition:
“... Auswertung der zusammengesetzten Einschränkungen hält auf der ersten Validierung
Fehler in Fall wird das Komponieren Einschränkung mit ReportAsSingleViolation kommentierte "