2017-02-24 1 views
0

Ich habe solches Feld in meiner Domain Modellklasse Validierung Einschränkungen:Doing JSR-303-Validierung in logischer Reihenfolge

@Column(nullable = false, name = "name") 
    @NotEmpty(groups = {Envelope.Insert.class, Envelope.Update.class}) 
    @Size(min = 3, max = 32) 
    private String name; 

Wenn dieses Feld leer ist („“) oder null, Validator erzeugt sowohl „darf nicht leer sein“ und "Größe muss zwischen ... sein" Fehlermeldungen. Ich verstehe es, aber wenn ich diesen Validierungsfehler dem Client zeige, erscheint es ziemlich seltsam (denn wenn etwas leer ist, kann es die Größenanforderungen nicht erfüllen, es ist nicht logisch).

Gibt es eine Möglichkeit, Spring mitzuteilen, dass die Validierung in der richtigen Reihenfolge durchgeführt wird? Wenn nicht @NotEmpty dann überprüfen Sie nicht @Size, und wenn @NotEmpty erfüllt ist, überprüfen Sie @Size.

Antwort

1

Nach Hibernate official document:

standardmäßig Einschränkungen werden in keiner bestimmten Reihenfolge ausgewertet und diese unabhängig davon, welche Gruppen sie gehören. In einigen Situationen, jedoch ist es sinnvoll, die Reihenfolge der Einschränkungen Auswertung zu steuern. Um eine solche Reihenfolge zu implementieren, würde man eine neue Schnittstelle definieren und sie mit @GroupSequence annotieren, wobei die Reihenfolge in definiert wird, für die die Gruppen validiert werden müssen.

Zunächst erstellen zwei Schnittstellen FirstOrder.class und SecondOrder.class und dann eine Gruppensequenz innerhalb OrderedChecks.java Verwendung @GroupSequence Annotation definieren.

public interface FirstOrder { 
} 

public interface SecondOrder { 
} 

@GroupSequence({FirstOrder.class, SecondOrder.class}) 
public interface OrderedChecks { 
} 

Fügen Sie schließlich Gruppen in Ihren Bean Constraints-Annotationen hinzu.

@Column(nullable = false, name = "name") 
@NotEmpty(groups = {FirstOrder.class, Envelope.Insert.class, Envelope.Update.class}) 
@Size(min = 3, max = 32, groups=SecondOrder.class) 
private String name; 
0

Das folgende Beispiel wird aus dem

public class Address { 
    @NotEmpty(groups = Minimal.class) 
    @Size(max=50, groups=FirstStep.class) 
    private String street1; 

    @NotEmpty(groups=SecondStep.class) 
    private String city; 

    @NotEmpty(groups = {Minimal.class, SecondStep.class}) 
    private String zipCode; 
    ... 

    public interface FirstStep {} 

    public interface SecondStep {} 

    @GroupSequence({Firststep.class, SecondStep.class}) 
    public interface Total {} 
} 

JSR-303 docs genommen und den Validator wie diese

validator.validate(address, Minimal.class, Total.class); 
Aufruf