2013-01-23 37 views
3

我正在驗證一個大的bean。它基於動態表單頁面。某些正在驗證的字段在表單中不可見,因此爲空或爲空。但我不希望看不見的字段被驗證。有時它們是可見的,我希望它們能夠被驗證,有時它們不可見,我不希望它們被驗證。在提交之前,我首先採用了從序列化表單中剝離這些字段的方法。但它仍然驗證缺少的字段,因爲它們存在於帶有驗證標籤的bean中。什麼是正確的方式來做我想做的事情?JSR-303如何在某些時間忽略特定字段的驗證

回答

3

一種可能的方法是使用驗證組。您爲不同的組定義不同的驗證規則。之後,您可以爲這些組中的一個或一組組調用驗證程序。

public class TestBean { 

    @NotNull(groups= {Group1.class}) 
    @Size.List({ 
     @Size(min=1, groups= {Group1.class}), 
     @Size(min=0, groups= {Group2.class}) 
    }) 
    private String test; 
} 

public interface Group1 { } 
public interface Group2 { } 

,那麼你可以調用驗證一個或多個這些組

Validator validator = ....; 
Set<ConstraintViolation<Object>> constraintViolations = validator.validate(objectToValidate, Group1.class); 

的更多信息有關驗證組看到here

+0

我不確定在閱讀鏈接的頁面後,如何使用這種情況的分組。我不想斷言,我需要返回到有問題字段旁邊的錯誤頁面。另外,它是一個bean。不是bean擴展bean擴展bean。而對於很多領域,我更喜歡使用默認的驗證器。我不想爲每個領域編寫定製。 –

+0

我認爲團體是正確的路要走。組旨在根據某些使用情況選擇/分組一組約束。使用組時,不需要「bean extend bean」。問題是你如何在validate調用中定位正確的驗證組。這將取決於您的集成技術以及您如何使用Bean驗證。 – Hardy

+0

我在組中看到的麻煩是組根據頁面上可見的字段而不同。此外,我希望字段級別的錯誤顯示在頁面上。我正在探索一種將忽略列表傳遞給驗證器的方法,然後如果該列表中的字段僅通過驗證。如果它不在列表中,請執行其驗證並正確傳遞失敗。這樣,決定讓字段可見或不可見的邏輯位於一個點而不是兩個點。這將使它難以維持。訣竅是每次驗證都要通過列表。隨着現場驗證。 –