2012-04-11 69 views
3

讀取規格爲JSR-303:併發Bean驗證

一個約束驗證實現的實例的生命週期是不確定的

初始化方法由之前的任何使用Bean驗證提供者稱爲的約束實現。

每次驗證給定值時,Bean驗證提供程序都會對isValid方法進行評估。如果該值無效,則返回 ,否則返回true。 isValid實現必須是線程安全的。

我不太明白。 初始化之前被稱爲isValid調用,而isValid應該是線程安全的?這是否意味着我無法在課程級別存儲任何東西,以便初始化以便從isValid以後訪問它?特別是我需要傳遞給的註釋實例初始化爲

有人可以闡明它嗎?

回答

4

並不是說initialize()應在每次調用isValid()之前調用。對於相同的註釋,在多次調用isValid()之前,它只能被調用一次。例如,its javadoc說:

初始化驗證在參考isValid準備調用

+0

它說'任何使用之前'不是暗示? – Arash 2012-04-11 15:38:44

+0

@Arash:據我所知,「在任何使用之前」並不意味着「在每次使用之前」,這意味着不允許使用未初始化的實例。 – axtavt 2012-04-11 15:47:11

3

對每個約束調用initialize()方法一次,而每個約束的驗證都調用isValid()

完全可以將傳遞到isValid()的註釋(或其單個屬性)存儲到驗證程序的字段中,稍後從isValid()訪問它。您可以在Hibernate Validator參考指南中找到示例。

你只需要同時確保您的isValid()方法可能是可調用多個線程(因此,例如,您可能無法從isValid()內改變你的驗證程序的狀態,不同步)。