4

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

class Contact {

    def Seeker

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

    Date initiatedDate
    Date acceptedDate

    static transients = ['pal']
    Seeker pal
}

whereSeeker是一个 groovy 类,它不是域对象,而是某些属性的占位符。

到目前为止一切都很好,我的联系人表没有pal预期的字段。在我ContactController的查询中,我查询了一堆联系人,c然后查找他们的Seeker朋友(如何保留的详细信息)并将该pal字段设置为一个新对象。

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

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

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

谢谢

4

1 回答 1

8

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

高温高压

(还发现了这个: http: //old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970

于 2010-01-27T16:23:48.787 回答