JSON的Grails 2.4命名配置不起作用
Posted
技术标签:
【中文标题】JSON的Grails 2.4命名配置不起作用【英文标题】:Grails 2.4 named configuration for JSON not working 【发布时间】:2014-10-23 18:14:45 【问题描述】:我无法使用指定的命名配置将对象呈现为 JSON。我做错了什么?
我在 Bootstrap.groovy 初始化方法中定义了一个命名配置
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 =
然后我有一个经典的控制器(不是 REST,而是简单的控制器):
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 命名配置中指定的三个属性,而不是我得到所有 bean 属性以及元类属性“class”和“id”。
如果我没有指定命名配置,那么 JSON 会正确渲染 bean,只显示三个属性。
怎么了?是否也可以在非 REST 控制器中使用 namedConfig?
【问题讨论】:
【参考方案1】: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
]
【讨论】:
非常感谢,您说得对。我阅读了文档,但误解了如何将其与命名配置一起使用! @GiorgioAndretti 不用担心。很高兴知道您阅读了文档。 :)以上是关于JSON的Grails 2.4命名配置不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Grails 数据库迁移插件 updateOnStart 不起作用