我有在其予想存储的几件事情,其仅在运行时存在的域对象。我看着文档,发现transients关键字,它,在它的脸是我所期待的。这里是我的域对象看起来像......

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()方法

由于

有帮助吗?

解决方案

瞬变确实用于停止字段域对象被持续。 (如果你想,而不必把它放在你的控制器,你可以使用的onLoad()事件或写这将覆盖默认属性的getter一个getPal()方法执行的PAL领域的一些INIT)。你也有权请注意,默认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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top