3

AFAIK JSR-303 は、標準の Bean 検証システムです。

このような検証を実行できるかどうかはわかりません (いいえだと思います)。

  • オブジェクトに削除済みフラグが設定されている場合、そのオブジェクトを変更することはできません
  • 日付が過ぎた後は、開始日のプロパティを変更できません
  • Bean の一部の整数プロパティを減らすことはできません

では、オブジェクトの以前の状態に依存する検証をどのように処理すればよいのでしょうか?

hibernate3.5-spring3-JPA2の環境でそのような問題を解決したいと思います。

ありがとう


私の解決策は、休止状態をいじり、オブジェクトをリロードして古い状態を確認することでした(新しいオブジェクトを削除した後)。今回は、よりスマートなソリューションが必要です...

4

7 に答える 7

2

これは、JSR 303 検証 (または私が使用した他の検証フレームワーク) を使用して実行できるとは思いません。通常、検証はステートレスです。オブジェクトのインスタンスを渡すと、検証フレームワークがテストを行って、オブジェクトの現在の値が有効であることを確認します。オブジェクトの以前の状態に関する実際の知識はありません。

これを行うことができます-検証ではありません。制約されたプロパティを使用するか、プロキシ パターンまたは AOP を使用してこれを機能させることができます。

于 2010-05-19T13:41:24.913 に答える
1

(以前の状態に関して)検証したいフィールドは、実際のデータではなく、レコードに関するすべてのメタデータであるように聞こえます。これらのフィールド (idDeleted、createdDate など) はすべてドメイン層から除外した方がよいため、検証は必要ありません。これらの値を決定および設定するためのロジックをデータアクセスレイヤーに配置して、リポジトリインターフェイスを使用するシステムがそれらを正しく取得することを知ったり気にしたりする必要がないようにします。

これらのフィールドがメタデータであるという私の仮定が正しくなく、検証が以前の状態に依存するユーザー入力データがある場合、以前の値の追加のルックアップはばかげているとは思いませんし、問題外であってはなりません。 . あなたの場合は理にかなっています。Hibernate 自体は、その保存機能を使用するときに INSERT または UPDATE のどちらを行うかを決定するために内部でルックアップを行います。

合理的な解決策が見つかることを願っています。

于 2010-05-27T21:10:15.783 に答える
0

代わりにOValを確認することをお勧めします。この種の検証は常に行っています。通常、オブジェクトと値を取得するSimpleCheckを使用して実行され、あらゆる種類のクロスチェックを実行できます。

于 2010-08-06T10:54:37.983 に答える
0

すぐに使えるソリューションも知りません。検証が「静的」であるため、JSR-303は機能しないと思われます。

しかし...

アイデアは、それを行うためにいくつかの AOP テクニックを使用することです。そう...

オブジェクトに削除済みフラグが設定されている場合、そのオブジェクトを変更することはできません

これは、すべてのセッターに登録されたプロキシ メソッドとして実装します。プロキシ メソッドは「削除済み」フラグをチェックします。true に設定されている場合は例外がスローされ、それ以外の場合は元のメソッドが実行されます。

日付が過ぎた後は、開始日のプロパティを変更できません

これは似ています。今回は、インターセプトされたセッターの他のプロパティにはアクセスしませんが、フィールドとセッター引数の元の (まだ変更されていない) 値にアクセスします。

Bean の一部の整数プロパティを減らすことはできません

これは日付と同じですが、唯一の違いは日付タイプ (日付と整数) です。

AOP がこのタスクに適しているかどうかは議論の余地がありますが、それでも解決策です。私も疑問です。

もう1つの懸念は、JPAエンティティにこれらの制約を適用したいと思うことです。したがって、Spring AOPを使用することは、エンティティが Spring によって管理されないため、それほど簡単ではありません。

于 2010-05-27T21:20:09.200 に答える
0

まったく異なるアプローチは、検証チェックをプロパティのセッターに入れることです。欠点は、宣言性が失われることです。

例:

public void setCounter(int newCounter) {
    if (newCounter < this.counter) {
       throw new IllegalOperationException("Cannot decrease the counter");
    } else {
       this.counter = newCounter;
    }
}
于 2010-05-27T21:23:17.163 に答える
0

オブジェクトの以前の状態に依存する検証をどのように処理できますか?

100%実行可能かどうかはわかりませんが、考えられる唯一の方法は、「新しい状態」と「古い状態」(一時的) で構成されるオブジェクト グラフを作成し、オブジェクト グラフ全体を検証することです。カスタム制約を使用します。それは少なくとも私が試みることです。

于 2010-05-19T14:47:25.810 に答える
0

おそらく、以前の状態を表すデータのコピーを指す、以前のバージョンを示す一時フィールドを作成します。このオブジェクトは構築時に作成されますが、一時的なものとしてマークされているため、シリアル化されません。次に、それに対して検証を行います。

最も簡単な実装は、オブジェクトのコピーを作成してフィールドに入れる makeACopy() というメソッドを追加することです。

Clonable を実装するか、リフレクションを行うユーティリティ クラスを作成することで複雑さを増すことができますが、それはあなた次第です。考えやすいので、makeACopy() とリファクタリングを後で行うことをお勧めします。

于 2010-05-22T00:38:27.167 に答える