2010-01-27 54 views
4

我有一個域對象,我想存儲一些只存在於運行時的東西。我看了一下documentation,發現了transients這個關鍵字,這個關鍵字就是我想要的。這裏是我的域對象看起來像......這是Grails瞬變的有效用法嗎?

class Contact { 

    def Seeker 

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

    Date initiatedDate 
    Date acceptedDate 

    static transients = ['pal'] 
    Seeker pal 
} 

其中Seeker是一個常規類,這是不是一個域對象,但對一些性能的佔位符。

到目前爲止,一切都很好,並如預期我的聯繫表沒有一個pal場。在我ContactController我查詢了一堆接觸,c的,再看看他們的Seeker好朋友(如何隱瞞細節)和pal字段設置爲一個新的對象。

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

這一切似乎工作正常,除了pal對象從返回的JSON丟失。

這是一個有效的瞬態使用?文檔提到它們對於基於函數的getter和setter來說很方便,但在我的情況下,我需要一個實際的對象。我應該在我的對象上編寫一個getPal()和setPal()方法嗎?

感謝

回答

7

瞬變確實是用來被堅持停在域對象的字段。 (如果你想在pal字段上執行一些init操作,而不必將它放到你的控制器中,你可以使用onLoad()事件或者寫一個getPal()方法來覆蓋默認屬性getter)。您也可以注意到,默認的JSON編組僅呈現持久字段。

當渲染我的域對象,我發現它有用創建JSON對象marshallers讓不需要的屬性不會呈現,但它也將解決您的暫時性問題了。您可以使用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中,他們會在你的控制器提供的marshallers。

HTH

(也發現了這個:http://old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970

+0

好吃,謝謝!我會嘗試一下 – Simon 2010-01-27 16:28:53

+0

作爲一個感興趣的問題,如何將它放在bootstrap.groovy中?我需要包含來自grails.converters的JSON編組嗎? – Simon 2010-01-27 16:30:54

+0

把它放入init關閉並導入grails.converters.JSON(我已經更新了示例中的帖子來展示這個) – 2010-01-27 18:19:50