実行時に注釈/Hibernate 検証ルールを変更するにはどうすればよいですか?
-
09-09-2019 - |
質問
いくつかのフィールドを持つ Java クラスがある場合は、Hibernate Validator を使用して検証したいと思います。ここで、ユーザーが実行時にどの検証を行うかを設定できるようにしたいと考えています。
例えば:
public class MyPojo {
...
@NotEmpty
String void getMyField() {
...
}
...
}
を削除したいとしましょう NotEmpty
チェックするか、次のように置き換えます Email
または CreditCardNumber
, 、どうすればいいでしょうか?それは可能ですか?実行時にアノテーションを変更することになると思います...
解決
普通はできませんよ。
Hibernate Validator を介してより動的な検証を機能させるために私が行ったことは次のとおりです。
- を延長します。
ClassValidator
クラス。 - オーバーライド
getInvalidVaues(Object myObj)
方法。まず、電話してくださいsuper.getInvalidValues(myObj)
, を選択し、カスタマイズした検証にフックを追加します。 - カスタムバリデーターをインスタンス化して呼び出します
getInvalidValues
検証します。Hibernate の注釈付き検証はこの時点で開始され、カスタム動的検証 (注釈でサポートされていないもの) も同様に開始されます。
例:
public class MyObjectValidator extends ClassValidator<MyObject>
{
public MyObjectValidator()
{
super(MyObject.class);
}
public InvalidValue[] getInvalidValues(MyObject myObj)
{
List<InvalidValue> invalids = new ArrayList<InvalidValue>();
invalids.addAll(Arrays.asList(super.getInvalidValues(myObj)));
// add custom validations here
invalids.addAll(validateDynamicStuff(myObj));
InvalidValue[] results = new InvalidValue[invalids.size()];
return invalids.toArray(results);
}
private List<InvalidValue> validateDynamicStuff(MyObject myObj)
{
// ... whatever validations you want ...
}
}
したがって、カスタム検証コードには、「ユーザーが設定した場合はこの検証を実行し、そうでない場合はその検証を実行する」などのロジックを含めることができます。Hibernate 検証を実行する同じコードを利用できる場合とできない場合がありますが、いずれにせよ、実行していることは Hibernate Validator の「通常の」使用例よりも複雑です。
他のヒント
実際には休止状態バリ4.1で可能です。ただ、/ <プログラムによる制約の作成に関するドキュメントを読みます>。
私はそれは、クラス定義の一部だ、あなたは注釈を削除または変更することができるでしょうとは思いません。あなたは、新しいランタイムで可能であるクラスが、少し関与を構築することができます。 Hibernateは検証へのプログラムによるアクセスをサポートし、注釈を上書きする可能性があり、私にはよくAPIを知りません。 Hibernateはランタイムクラス建物自体のビット...もし興味があるならそれを行う方法を学習するには良い場所かもしれませんします。