我有一个域对象,我想在其上存储一些只存在于运行时的东西。我查看了documentation并找到了transients
关键字,从表面上看它就是我想要的。这是我的域对象的样子......
class Contact {
def Seeker
def beforeInsert()
{
initiatedDate = new Date()
}
Date initiatedDate
Date acceptedDate
static transients = ['pal']
Seeker pal
}
其中Seeker
是一个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()方法吗?
由于
答案 0 :(得分:7)
瞬态确实用于阻止域对象中的字段被保留。 (如果你想在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)