_@Email
_で注釈が付けられたemailプロパティを持つUser
エンティティがあります
_@Email
private String email;
_
コントローラクラスで_@Valid
_(javax.validation.Valid)アノテーションを使用しています。問題は、コントローラーバリデーターが無効な電子メールを渡していることです。例:
pusp @ 1-明らかにこれは無効なメールアドレスです
pusp @ fake
私が気付いたパターンは、_@Email
_はsometext @ textだけが必要で、拡張子(.com/orgなど)を気にしません。予想される動作ですか? @Email(regex="")
に独自の正規表現実装を渡す必要がありますか
バリデーターによれば、.
のないメールは有効であると見なされます。
一般的な方法では、バリデーターの実装(ここではおそらくHibernate Validatorです)は、電子メールに関してそれほど制限的ではありません。
例 org.hibernate.validator.internal.constraintvalidators.AbstractEmailValidator
javadocの状態:
有効なメールの仕様は RFC 2822 にあり、仕様に従ってすべての有効なメールアドレスに一致する正規表現を作成できます。 ただし、 この記事 で説明されているように、100%準拠の電子メール検証を実装することは必ずしも実用的ではありません。この実装はトレードです-offたとえば、二重引用符やコメントが含まれる電子メールを無視しながら、ほとんどの電子メールを照合しようとします。
ちなみに、メール用のHTMLバリデーターでも同様に気づきました。
ですから、実際に遭遇する行動は、予想通りの行動だと思います。
そしてあなたの質問について:
@ Email(regex = "")に独自の正規表現実装を渡す必要がありますか
確かに。検証をより制限的にしたい場合は、他に選択肢はありません。
代わりに、この answer 制約構成を介して独自のバリデーターを作成することは、それが本当に興味深いですDRY(カスタムConstraintValidator
は、含まれるパターンを毎回指定せずに)、@Email
ConstraintValidator
の「良い部分」を再利用します。
@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 {};
}