1

私はカスタム制約を検証したいネストされたクラスをいくつか持っています。ただし、カスタム制約のバリデータでは、Childクラスのフィールドがnullでないか、NPEをスローする必要があります。GroupSequenceを使用してネストされたBeanを検証し、すべてのグループを一度に適用する

カスタム制約とデフォルト制約がすべて同じクラスにある場合、GroupSequenceを使用して、他の制約を適用する前に1組の制約を適用できます。私の例のコードは、Groovyである

@MyConstraint(groups = SecondPass) 
@GroupSequence([Parent, SecondPass]) 
class Parent { 
    @Valid 
    Child child 
} 

class Child { 
    @NotNull 
    String cannotBeNull 
} 

注:

私は、ネストされたクラスと似た何かをしようとしている設定は、次のようになります。

ネストされたクラスでは、HibernateのValidatorImplは、指定されたすべてのグループを最初にParentに、次にChildに適用しようとしているようです。したがって、cannotBeNullがnullかどうかを確認する前に、MyConstraintの検証を試み、存在する場合はNPEをスローします。

GroupSequenceの後のグループで制約を検証する前に、バリデータが(単一の検証呼び出しで)オブジェクトグラフ全体を1つのグループに対して検証する方法がありますか?

答えて

1

あなたの問題は、ここで@GroupSequenceをどのように使用するかと思います。残念ながら、@GroupSequenceの2つの用途があります。 1つは、検証のためのシーケンスを定義することです。これは、@GroupSequenceがインタフェースで使用され、このインタフェースがValidatorの呼び出しの一部として要求されたときです。たとえば、Validator.validate(bean, MyGroupSequenceInterfaceClass.class)。この場合、シーケンスはオブジェクトグラフ全体に適用されます。

@GroupSequenceを使用して、クラスのデフォルトシーケンスを再定義しています。この場合、Parentのグループがであると検証された場合、Parent(別名Default)の最初の制約とSecondPassの制約が検証されます。このシナリオでは、デフォルトのグループ順序は実際のBeanに対してのみ変更されます。この場合、Parent。それはオブジェクトグラフ(@Valid)に沿って渡されません。 Defaultグループは@Validの境界を超えて渡されます。

関連する問題