私は JSR 303 BV の大ファンですが、現在のプロジェクトでは「コンテキスト依存の検証」が多く、BV でそれらを実装する合理的な方法が見つかりません。基本的に、検証ルールは以下に依存できます
- ログインしたユーザー (http リクエストに保存されます)
- 操作対象のユーザー - ユーザーの ID は /foo/bar/user/1/sth のような REST URL のパス パラメータです
- これらの両方
ちょっとした例:
class Alphabet{
@Valid
private Alpha a;
@Valid
private Beta b;
@Valid
private Gamma g;
}
検証ルール: URL で提供される ID を持つユーザーがロール「admin」を持っている場合、「a」、「b」、「g」プロパティのいずれも null にすることはできません。ロールが「user」の場合、「a」のみが null であってはならず、他の props は null である必要があります。
したがって、基本的にこれらの種類のルールは、Alphabet クラスのクラス レベルの制約として簡単に実装できますが、カスタム バリデーターは URL で提供されるユーザーのアクセス ID を何らかの方法で必要とします。これを達成できるスマートな方法はありますか、またはすべての REST クライアントにユーザー ID を複数回渡すように強制する必要があります: URL とペイロードで、後者は BV によってのみ使用されます。より複雑なケースは、検証ルールがログインしているユーザーに依存する場合です。そのため、カスタム バリデーターは、ThreadLocal または HttpServletRequest から認証されたプリンシパルにアクセスする必要があります。