web-dev-qa-db-ja.com

Java /電子メールアドレスのSpring MVC 3検証

Spring MVCでJavaバックエンドを使用しており、メールアドレスのドメインオブジェクトでこのように検証を使用しています。

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
...
@NotNull
@Size(min = 1, max = 100)
@Pattern(regexp="^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]{2,4})$")
private String email;

しかし、私はこれらのコード行ですべてを得る

Set<ConstraintViolation<Person>> failures = validator.validate(personObject);
...
Map<String, String> failureMessages = new HashMap<String, String>();
for (ConstraintViolation<Person> failure : failures) {
    failureMessages.put(failure.getPropertyPath().toString(), failure.getMessage());
    System.out.println(failure.getPropertyPath().toString()+" - "+failure.getMessage())
}

コンソールでこれを取得します:

email - must match "^([a-zA-Z0-9\\-\\.\\_]+)'+'(\\@)([a-zA-Z0-9\\-\\.]+)'+'(\\.)([a-zA-Z]{2,4})$"

しかし、私はメールアドレスとして_[email protected]。したがって、正規表現は一致しません。

だから私には2つの問題があります:

  • ここで何が問題なのですか?
  • そして、これをユーザーに表示するのは良いことではないので、自分でエラーメッセージを定義するにはどうすればよいですか:-)

よろしくお願いします。

20
Tim

Hibernate Validator を使用する場合、 @ Email注釈 を使用できます。とにかく、カスタム制約注釈を作成し、リソースプロパティファイルに表示するカスタムメッセージを設定できます。

43
Javi

まず、次のような単純な正規表現を試してください。

"\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,4}\\b"

RFC 2822バージョンを試すことができるより:

"(?:[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])+)\\])"

どちらがあなたのために働いたかどうか私に知らせてください。

このパッケージもご覧ください

org.springmodules.validation.bean.conf.loader.annotation.handler

ここに
http://www.springbyexample.org/examples/spring-modules-validation-module.html

より良い代替案かもしれません。

9
Mat B.

Hibernate Validator から@Emailを使用できます。

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>5.4.1.Final</version>
    </dependency>
6

正規表現には'+'のインスタンスがいくつかありますが、これはちょっと奇妙です。電子メールアドレスには通常、単一引用符を含める必要はありません:)おそらくそれは文字列の一部を連結することを意図しており、それらは二重引用符である必要がありますか?

独自のメッセージを定義するには、注釈にmessage="{someWay.of.definingCodes}"を追加するだけです。次に、デフォルトパッケージのValidationMessages.propertiesでその翻訳を定義します。

または、ベンダー拡張機能に依存する場合は、hibernateバリデーターがorg.hibernate.validator.Emailを提供します。

2
Affe