2017-02-24 72 views
0

JSR-303驗證我有這樣字段在我的域模型類驗證約束:否則在邏輯順序

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

當該字段爲空(「」)或空時,驗證器既產生「不能爲空」和「大小必須在......之間」錯誤消息。我明白了,但是當我向客戶端顯示這個驗證錯誤時,似乎很奇怪(因爲當某些東西爲空/空時它不能滿足大小要求,這不是合乎邏輯的)。

有沒有辦法告訴Spring按照正確的順序進行驗證?如果不是@NotEmpty則不檢查@Size,並且@NotEmpty滿足時檢查@Size

回答

1

根據Hibernate official document:

默認情況下,約束沒有特定的順序進行評估,這 不管他們屬於哪個組。然而,在某些情況下,控制約束條件的順序是有用的。爲了執行這樣的命令,人們將定義一個新的接口並用@GroupSequence對它進行註釋,該接口定義了在 中的組必須被驗證的順序。

首先,創建兩個接口FirstOrder.class和SecondOrder.class,然後使用@GroupSequence註釋限定內部OrderedChecks.java組序列。

public interface FirstOrder { 
} 

public interface SecondOrder { 
} 

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

最後,在您的bean約束條件註釋中添加組。

@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

下面的例子是從JSR-303 docs

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 {} 
} 

取出並調用這樣

validator.validate(address, Minimal.class, Total.class); 
驗證