2010-11-19 52 views
4

我寫了一個非常簡單的測試用例,發現當我調用一個域對象時,Grails只做了一個淺層驗證。我可以在Grails中進行深入驗證嗎?有誰能夠幫助我?grails在域對象上驗證方法

class Person { 
    Address address 
} 

class Address { 
String city 
} 

當我做新Address().validate()返回false但是當我做new Person(address: new Address()).validate返回true。

+0

問題放棄了。 – robbbert 2010-12-02 04:10:46

回答

7

雖然validate()save()方法目前沒有記錄「深度驗證」,但will be in future(文檔指出文檔已丟失,但與完整的1.3.x樹相關)。有關這些方法的deepValidate參數的文檔然後will state

@ deepValidate @(可選) - 確定是否 域 實例的關聯也應驗證,即 是否驗證級聯或 不。這是@ true @默認情況下 - 將 設置爲@ false @以禁用級聯 驗證。

測試,然而,表明 「深驗證」 是在任何情況下不進行:

  • 一個-to-one關聯
  • 一個-to-many關聯
    • 使用匹配設置器分配的關聯對象
    • 使用匹配分配的關聯對象方法,例如,person.addToAddresses(..)
  • 同時使用validate()save()方法,
    • 並且還使用這兩種方法具有顯式deepValidate: true參數

Similar findings have been published at another place,分類所述「非行爲「作爲」已知問題「。我自己的全面的測試用例可以是downloaded from here

解決方案,最後是手動調用子對象上的驗證:

class Person { 
    Address primaryAddress 
    static hasMany = [secondaryAddresses: Address] 

    static constraints = { 
     primaryAddress validator: { 
      it?.validate() 
     } 
     secondaryAddresses validator: { 
      it?.every { it?.validate() } 
     } 
    } 
}