web-dev-qa-db-ja.com

無効なメールアドレスに一致するjavax.validation.constraints.Email

_@Email_で注釈が付けられたemailプロパティを持つUserエンティティがあります

_@Email
private String email;
_

コントローラクラスで_@Valid_(javax.validation.Valid)アノテーションを使用しています。問題は、コントローラーバリデーターが無効な電子メールを渡していることです。例:
pusp @ 1-明らかにこれは無効なメールアドレスです
pusp @ fake
私が気付いたパターンは、_@Email_はsometext @ textだけが必要で、拡張子(.com/orgなど)を気にしません。予想される動作ですか? @Email(regex="")に独自の正規表現実装を渡す必要がありますか

7
TheCoder

バリデーターによれば、.のないメールは有効であると見なされます。
一般的な方法では、バリデーターの実装(ここではおそらくHibernate Validatorです)は、電子メールに関してそれほど制限的ではありません。
org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidator javadocの状態:

有効なメールの仕様は RFC 2822 にあり、仕様に従ってすべての有効なメールアドレスに一致する正規表現を作成できます。 ただし、 この記事 で説明されているように、100%準拠の電子メール検証を実装することは必ずしも実用的ではありません。この実装はトレードです-offたとえば、二重引用符やコメントが含まれる電子メールを無視しながら、ほとんどの電子メールを照合しようとします。

ちなみに、メール用のHTMLバリデーターでも同様に気づきました。

ですから、実際に遭遇する行動は、予想通りの行動だと思います。
そしてあなたの質問について:

@ Email(regex = "")に独自の正規表現実装を渡す必要がありますか

確かに。検証をより制限的にしたい場合は、他に選択肢はありません。
代わりに、この answer 制約構成を介して独自のバリデーターを作成することは、それが本当に興味深いですDRY(カスタムConstraintValidatorは、含まれるパターンを毎回指定せずに)、@EmailConstraintValidatorの「良い部分」を再利用します。

@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 {};
}
14
davidxxx