当前位置:  开发笔记 > 前端 > 正文

这是Grails瞬态的有效使用吗?

如何解决《这是Grails瞬态的有效使用吗?》经验,为你挑选了1个好方法。

我有一个域对象,我想在其中存储一些只存在于运行时的东西.我查看了文档并找到了transients关键字,从表面上看它就是我想要的.这是我的域对象的样子......

class Contact {

    def Seeker

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

    Date initiatedDate
    Date acceptedDate

    static transients = ['pal']
    Seeker pal
}

其中Seeker是一个groovy类,它不是域对象,而是一些属性的占位符.

到目前为止一切正常,我的Contact表没有pal预期的字段.在我ContactController查询一堆联系人时c,然后查找他们的Seeker伙伴(详细说明如何保留)并将pal字段设置为新对象.

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

除了返回的JSON中缺少pal对象之外,这一切似乎都能正常工作.

这是瞬态的有效使用吗?文档提到它们对基于函数的getter和setter很方便,但在我的情况下我想要一个实际的对象.我应该在我的对象上编写getPal()和setPal()方法吗?

谢谢



1> Dave Bower..:

瞬态确实用于阻止域对象中的字段被持久化.(如果你想在pal字段上执行一些init而不必将它放在你的控制器中,你可以使用onLoad()事件或编写一个覆盖默认属性getter的getPal()方法.您还应该注意,默认的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)

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有