8

状況: ユーザー プロパティに基づいて Hibernate Validation を実行したい (ユーザーのアカウント データに基づいて、入力に対して異なる検証ルールを許可するため) - .properties ファイルを使用して特定の正規表現を指定できる必要があると思いますが、何が間違っているのかわかりません:

検証正規表現を指定する私の現在の方法は、特定のインターフェースファイルの定数からその正規表現を引き出し(すべてをまとめるため)、@Pattern()変数ごとの注釈に定数としてプラグインします-たとえば、変数の場合workPhone

@Column(name = "WORK_PHONE")
@NotEmpty(message = "{ContactInfo.workPhone.notEmpty}")
@Pattern(regexp = PHONE_NUMBER_PATTERN_SL, message = "{ContactInfo.workPhone.regexp.msg}")
@Size(max = 10, message = "{ContactInfo.workPhone.size}")
protected String                workPhone;

...正規表現がに保存され、static final String PHONE_NUMBER_PATTERN_SLすべての{ContactInfo.workPhone...}呼び出しは .properties ファイルから来ます:

ContactInfo.workPhone.notEmpty=Please enter your phone number.
ContactInfo.workPhone.regexp.msg=Invalid characters entered in phone. Use this format XXX-XXX-XXXX.
ContactInfo.workPhone.size=Phone can not be longer than 10 digits.

残念ながら、この配置では、検証パターンがアプリケーション全体 (コンパイル済み) になります。別の会社、場所、雇用位置などの別のユーザー用に変更する方法がわからないためです。この情報、正規表現もプロパティファイルに保存したいので、次のように含めようとします:

ContactInfo.workPhone.regexp=\d{3}-\d{3}-\d{4}

最初のコード リストの 3 行目の注釈に参照を含めます。

@Pattern(regexp = "{ContactInfo.workPhone.regexp}", message = "{ContactInfo.workPhone.regexp.msg}")

次に、米国以外の電話番号形式を許可/要求するなど、さまざまな場合に合わせてプロパティ ファイルを切り替えます。

質問:やりたいことはできますか?パターンを指定するより良い方法はありますか (プロパティ ファイルの代わりにデータベース呼び出しを許可する可能性があります)。

さらに、私はこれが得意ではありません (別の開発者から引き継いでいるため) ので、誰かが @Pattern アノテーションまたは他の Hibernate 正規表現検証マークアップの使用に関する焦点を絞ったリソースに私を向けることができれば、それは必要なすべての情報を提供してくれるかもしれません。

TL;DR : Hibernate パターン検証で使用される式に、定義済みおよびプリコンパイル済みの定数ではなく、動的に設定または変更された値を使用することは可能ですか?

4

1 に答える 1

6

アノテーション内では定数式しか参照できないため、プロパティ ファイルまたはデータベースから値をロードすることはできません。

実行時に制約を定義できる Hibernate Validator 4.2 で導入された動的制約宣言にAPIを使用できます。あなたの例は次のようになります。

String dynamicPattern = ...;

ConstraintMapping mapping = new ConstraintMapping();
mapping.type( ContactInfo.class )
    .property( "workPhone", FIELD )
    .constraint( new PatternDef().regexp( dynamicPattern ) );

HibernateValidatorConfiguration config = 
    Validation.byProvider( HibernateValidator.class ).configure();
config.addMapping( mapping );

Validator validator = config.buildValidatorFactory().getValidator();
于 2012-01-27T20:55:05.633 に答える