这是Grails的瞬变的有效使用?
-
23-09-2019 - |
题
我有在其予想存储的几件事情,其仅在运行时存在的域对象。我看着文档,发现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 )
不隶属于 StackOverflow