2016-05-13 4 views
0

Ich verwende den Hibernate Validator 5.2, der Unterstützung für Java 8 type_use-Annotationen bietet. Ich möchte in der Lage sein, den Inhalt einer Liste innerhalb einer Map zu validieren - mit anderen Worten, ich möchte, dass sie herunterkippt und den Inhalt von Maps und Listen überprüft, unabhängig davon, wie sie verschachtelt sind.Validierungsliste in einer Map mit Hibernate Validator 5.2 +

Eine einfache Karte Beispiel:

Map<String, List<Promotion>> promotionsByGroupName = ...; 

Was würde Ich mag in der Lage sein zu tun:

@Valid 
Map<String, List<@Valid Promotion>> promotionsByGroupName = ...; 

jedoch nicht als Standard @Valid Annotation funktioniert nicht gesetzt werden auf diesem Element. Also habe ich eine benutzerdefinierte Anmerkung, die ich darf dort platzieren:

@Valid 
Map<String, List<@ValidPart Promotion>> promotionsByGroupName = ...; 

jedoch der Prüfer im Zusammenhang mit @ValidPart nie ausgelöst wird.

Die nächstgelegene ich schaffte es war die @ValidPart Anmerkung auf der Liste wie folgt zu setzen:

@Valid 
Map<String, @ValidPart List<Promotion>> promotionsByGroupName = ...; 

... und auspacken dann die Liste in dem zugehörigen Validator zu bekommen, die Elemente zu validieren (die leider beinhaltet das Aufrufen eines Validators innerhalb des ConstraintValidators und das "Neuschreiben" der resultierenden ConstraintViolations).

Meine Frage ist daher, gibt es eine Möglichkeit, diese Art von geschachtelten Validierungen zu tun, ohne die Liste selbst zu durchlaufen? Die Einschränkungsverletzung Pfade dies erzeugt nicht ganz das, was ich suche, wie sie aussehen:

promotionsByGroupName[GroupName].[0].name cannot be null 

statt (ohne Punkt zwischen Karte Schlüsselnamen und Index):

promotionsByGroupName[GroupName][0].name cannot be null 

Die [ 0] Teil ist der Index der Liste, die ich selbst hinzugefügt habe mit addPropertyName in diesem Code:

+0

Ich bin zu der Schlussfolgerung gekommen, dass das Aufrufen eines Validators in einem ConstraintValidator eine nutzlose Übung ist, da der ursprüngliche ConstraintDescriptor, der fehlgeschlagen ist, nicht in den neuen Constraint-Verletzungen beibehalten werden kann. Es sieht so aus, als ob die JSR-303-Spezifikation für einfache Personen-/Adressverletzungen geeignet ist, bei komplexen Datenstrukturen in der realen Welt jedoch stark fehlt. Roll mein eigenes. – john16384

Antwort

0

Nicht im Moment. Dieser Typ der geschachtelten Entpackung wird derzeit nicht vom Hibernate-Validator unterstützt.

0

Als eine Problemumgehung können Sie eine bestimmte Sammlungsart Promotions erstellen, die Sie als Kartenwerte anstelle von List<Promotion> verwenden.

Verwandte Themen