gpt4 book ai didi

json - JSON 的 Grails 2.4 命名配置不起作用

转载 作者:行者123 更新时间:2023-12-04 20:00:50 25 4
gpt4 key购买 nike

我无法使用指定的命名配置将对象呈现为 JSON。我在做什么错?

我在 Bootstrap.groovy init 方法中定义了一个命名配置

import com.appromocodes.Project
import com.appromocodes.Promocode
import grails.converters.JSON

class BootStrap {

def init = { servletContext ->


JSON.createNamedConfig('apiCheck', {
JSON.registerObjectMarshaller(Promocode) { Promocode promocode ->
def map= [:]
map['code'] = promocode.code
map['allowedUses'] = promocode.allowedUses
map['customInfo'] = promocode.customInfo

return map
}
})

}
def destroy = {
}
}

然后我有一个经典的 Controller (不是 REST,而是简单的 Controller ):
import grails.converters.JSON

class ApiV1Controller {

def apiV1Service

def check() {

log.info("check");

def resultMap = apiV1Service.checkPromocode(params.projectKey, params.code)


if (resultMap.statusCode != ResponseStatus.PROMOCODE_USED) {
}

def p = Promocode.get(1)

JSON.use('apiCheck', {
render p as JSON
})

}

}

我希望检查操作的调用将仅输出 apiCheck 中指定的三个名为 config 的属性,而不是我获得所有 bean 属性以及元类属性“class”和“id”。

如果我不指定命名配置,则 JSON 会正确呈现仅显示三个属性的 bean。

怎么了?是否也可以在非 REST Controller 中使用 namedConfig?

最佳答案

DefaultConverterConfiguration 带有默认配置的 JSON 作为参数传递给闭包。 That configuration has to be used to registerObjectMarshaller .所以闭包必须如下实现(注意闭包的参数)。

JSON.createNamedConfig('apiCheck', { config ->
config.registerObjectMarshaller(Promocode) { Promocode promocode ->
def map= [:]
map['code'] = promocode.code
map['allowedUses'] = promocode.allowedUses
map['customInfo'] = promocode.customInfo

return map
}
})

一个更简单、更清晰、更简洁的实现是:
JSON.createNamedConfig( 'apiCheck' ) { 
it.registerObjectMarshaller( Promocode ) { Promocode promocode ->
[
code : promocode.code,
allowedUses : promocode.allowedUses,
customInfo : promocode.customInfo
]
}
}

关于json - JSON 的 Grails 2.4 命名配置不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25573270/

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