1

Ich habe ein paar geschachtelte Klassen, für die ich eine benutzerdefinierte Einschränkung validieren möchte. Der Validierer für meine benutzerdefinierte Einschränkung erfordert jedoch, dass ein Feld in der Child-Klasse nicht null ist oder andernfalls eine NPE auslöst.Überprüfen verschachtelter Beans mithilfe einer GroupSequence und Anwenden jeder Gruppe auf einmal

Wenn meine benutzerdefinierten Constraint- und Standardeinschränkungen alle in derselben Klasse sind, weiß ich, dass ich eine GroupSequence verwenden kann, um einen Satz Constraints anzuwenden, bevor der andere angewendet wird.

Das Setup Ich habe etwas Ähnliches mit verschachtelten Klassen versuchen, sieht etwa so aus:

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

class Child { 
    @NotNull 
    String cannotBeNull 
} 

Beachten Sie, dass mein Beispiel-Code in Groovy ist.

Mit geschachtelten Klassen scheint der ValidatorImpl von Hibernate zu versuchen, zuerst alle angegebenen Gruppen auf Parent und dann auf Child anzuwenden. Daher versucht es, MyConstraint zu validieren, bevor überprüft wird, ob cannotBeNull null ist oder nicht, und eine NPE zu werfen, wenn dies der Fall ist.

Gibt es eine Möglichkeit, den Validator (in einem einzelnen Validierungsaufruf) zuerst den gesamten Objektgraphen gegen eine Gruppe validieren zu lassen, bevor eventuelle Einschränkungen in späteren Gruppen in der Gruppensequenz überprüft werden?

Antwort

1

Ich denke, Ihr Problem ist, wie Sie @GroupSequence hier verwenden. Leider gibt es zwei Verwendungen von . Eine besteht darin, die Reihenfolge für die Validierung zu definieren. Dies ist, wenn auf einer Schnittstelle verwendet wird und diese Schnittstelle als Teil des Aufrufs von Validator angefordert wird. Zum Beispiel Validator.validate(bean, MyGroupSequenceInterfaceClass.class). In diesem Fall wird die Sequenz auf das gesamte Objektdiagramm angewendet.

In Ihrem Fall verwenden Sie @GroupSequence, um die Standardsequenz einer Klasse neu zu definieren. In diesem Fall, wenn die Default Gruppe für Parent validiert ist, werden die ersten Bedingungen für Parent (aka Default) und dann die Einschränkungen für SecondPass validiert. In diesem Szenario wird die Standardgruppensequenz nur für die tatsächliche Bean geändert. In diesem Fall Parent. Es wird nicht entlang des Objektgraphen (@Valid) übergeben. Die Default Gruppe wird über die @Valid Grenze übergeben.

Verwandte Themen