2010-11-19 7 views
4

非常に単純なテストケースを書きましたが、ドメインオブジェクトに対してvalidateを呼び出すと、Grailsは浅い検証しか行わないことがわかりました。 grailsで深いバリデーションをすることは可能でしょうか?誰か助けてくれますか?grailsはドメインオブジェクトのメソッドを検証します

class Person { 
    Address address 
} 

class Address { 
String city 
} 

私は新しいAddress().validate()を行うと、それはfalseを返しますが、私はnew Person(address: new Address()).validateを行うときにtrueを返します。

+0

質問:

ソリューションは、最終的には、手動で子オブジェクトの検証を呼び出すことです。 – robbbert

答えて

7

現在validate()save()方法のために文書化されていない「深い検証が」、それはwill be in future(文書の完全な1.3.xのツリーに関連ながらドキュメントは、行方不明になっていると述べている)間。次いで、これらの方法deepValidateパラメータのドキュメントwill state:deepValidate @

(オプション) - ドメイン インスタンスの関連付けも 即ち検証カスケード又は 否かを、検証する必要があるかどうかを決定 。これはデフォルトで@ true @です。 を@ false @に設定すると、カスケード接続が無効になります。 検証。

テスト、しかし、「深い検証は」は、これらのケースのいずれにおいても行われていないであることを示しています

  • 一対一の団体
  • 1対多の連想
    • 対応するオブジェクトは、一致するセッターを使用して割り当てられます。
    • 両方validate()save()方法を使用して方法、例えば、person.addToAddresses(..)
  • 、また
    • および、明示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() } 
     } 
    } 
} 
関連する問題