2017-11-18 3 views
0

Ich benutze Hibernate Validator - 5.2.2 (JSR 303).Wie erstellt man benutzerdefinierte geschachtelte Validator mit JSR 303?

Ich mache eine Cross-Field-Validierung, also muss ich einen benutzerdefinierten Validator erstellen.

Allerdings habe ich keine Ahnung, wie die benutzerdefinierte bedingte verschachtelte Validierung zu tun.

Beispiel:

@ValidChildrenIfEnabled 
public class MainDto { 

    public boolean isEnabled; 
    public List<Child> children; 
} 

public class Child { 

    @NotBlank 
    public String name; 

    @Range(min = 1, max = 3) 
    public int age; 
} 

Wenn ich nicht bedingte Validierung brauche, würde ich @Valid oben auf "Kinder" setzen.

@Valid 
public List<Child> children; 

Hinweis: Ich weiß, wie eine benutzerdefinierte Validator zu schaffen, ich weiß nur nicht, wie eine benutzerdefinierte Validator erstellen, die verschachtelte Validierung zu tun, die die Vorteile des bestehenden Einbau-Validator übernehmen. Vielen Dank!

EDIT:

Meine Nutzlast tatsächlich noch eine Nutzlast hat, lassen Sie uns SuperDto sagen.

public class SuperDto { 

    @Valid 
    public List<MainDto> mainDtos; 
} 

Und ich Validierung wie folgt aus:

validator.validate(superDto); 

Antwort

1

Interessante Anwendungsfall. Leider glaube ich nicht, dass Sie tun können, was Sie tun möchten, da Sie eine Validierung von isValid() nicht auslösen können.

Angenommen, Sie haben andere Einschränkungen, die Sie in jedem Fall überprüfen möchten. Ich denke, die beste Problemumgehung ist wahrscheinlich die Verwendung von Gruppen. Und je nachdem, ob isEnabled wahr ist oder nicht, werden unterschiedliche Gruppen verwendet.

Wie auch immer, Sie müssten spezielle Fall, wie diese Bean validiert ist.

+0

Ich habe über die Verwendung von Gruppe nachgedacht, aber ich kann nicht um meinen Kopf wickeln, um Gruppierung zu verwenden. Tatsächlich hat die reale Nutzlast eine Ebene höher. So wird die Gruppierungsmethode schnell komplex. – janetsmith

+0

Ich bin mir nicht sicher, ob ich verstehe, warum Gruppierung für Sie komplex wäre. Könntest du es ein bisschen mehr erklären? Übrigens, was Sie verstehen müssen, ist, dass es die einzige Möglichkeit ist, einige Einschränkungen zu konditionieren. In Ihrem Beispiel haben Sie selbst dann noch ein großes Problem, wenn wir Ihnen eine Möglichkeit bieten, die Validierung von der Einschränkung auf Klassenebene auszulösen: HV wird die Beschränkungen auf Eigenschaftenebene trotzdem überprüfen. –

+0

Ich gehe davon aus, dass ich MainDto während der Kompilierzeit einer Gruppe zuweisen muss, richtig? Allerdings erhalte ich MainDto als Input-Payload von REST api. Daher kann ich eine Gruppe von MainDto nicht vorab zuweisen. Es sei denn, es gibt eine Möglichkeit zur Gruppierung während der Laufzeit. – janetsmith

Verwandte Themen