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?

War es hilfreich?

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 "

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top