4

実行時にのみ存在するいくつかのものを保存したいドメインオブジェクトがあります。ドキュメントを見て、キーワードを見つけましたtransients。これは一見、私が探していたものでした。これが私のドメインオブジェクトの外観です...

class Contact {

    def Seeker

    def beforeInsert() 
    {
       initiatedDate = new Date()
    }

    Date initiatedDate
    Date acceptedDate

    static transients = ['pal']
    Seeker pal
}

whereSeekerは、ドメイン オブジェクトではなく、一部のプロパティのプレースホルダーである groovy クラスです。

palこれまでのところすべて問題なく、私の Contact テーブルには期待どおりのフィールドがありません。私のContactControllerI では、一連の連絡先をクエリしc、次に彼らのSeeker仲間 (どのように保留されたかの詳細) を検索し、palフィールドを新しいオブジェクトに設定します。

c.pal = new Seeker();
c.pal.name = otherObject.name
render c as JSON

返された JSON に pal オブジェクトがないことを除いて、これはすべて正常に機能しているようです。

これはトランジェントの有効な使用法ですか? ドキュメントには、関数ベースのゲッターとセッターに便利であると記載されていますが、私の場合は実際のオブジェクトが必要です。オブジェクトに getPal() および setPal() メソッドを作成する必要がありますか?

ありがとう

4

1 に答える 1

8

トランジエントは、ドメイン オブジェクトのフィールドが永続化されるのを防ぐために実際に使用されます。pal(コントローラーに配置せずにフィールドで初期化を実行したい場合は、onLoad()イベントを使用するかgetPal()、デフォルトのプロパティゲッターをオーバーライドするメソッドを記述できます)。また、デフォルトの JSON マーシャラーは永続化されたフィールドのみをレンダリングすることに注意してください。

ドメイン オブジェクトをレンダリングするとき、不要なプロパティがレンダリングされないように JSON オブジェクト マーシャラーを作成すると便利であることがわかりましたが、一時的な問題も解決します。JSON.registerObjectMarshaller次のメソッドを使用してこれを行うことができます。

import grails.converters.JSON
...
class BootStrap {

    def init = {servletContext ->
        JSON.registerObjectMarshaller(Contact ) {
            def returnArray = [:]
            returnArray['id'] = it.id
            returnArray['initiatedDate'] = it.initiatedDate
            returnArray['acceptedDate'] = it.acceptedDate
            returnArray['pal'] = it.pal
            return returnArray
        }

        JSON.registerObjectMarshaller(Seeker) {
            ...
        }

マーシャラーを追加するBootStrap.groovyと、コントローラーで使用できるようになります。

HTH

(これも見つかりました: http://old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970 )

于 2010-01-27T16:23:48.787 に答える