gpt4 book ai didi

grails - 这是对 Grails transient 的有效使用吗?

转载 作者:行者123 更新时间:2023-12-05 00:07:23 25 4
gpt4 key购买 nike

我有一个域对象,我想在其上存储一些仅在运行时存在的东西。我看了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 friend 们(如何保留的详细信息)并设置 pal字段到一个新对象。
c.pal = new Seeker();
c.pal.name = otherObject.name
render c as JSON

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

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

谢谢

最佳答案

transient 确实用于阻止域对象中的字段被持久化。 (如果您想在 pal 字段上执行一些初始化,而不必将其放入 Controller 中,您可以使用 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 中添加编码器它们将在您的 Controller 中可用。

高温高压

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

关于grails - 这是对 Grails transient 的有效使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148413/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com