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 不起作用

Tomcat“Log4J”上的 Grails WAR 根本不起作用

Grails 发送邮件不起作用

grails验证嵌套命令对象不起作用

Grails 命名查询 - 按关联查找

grails中的列类型不起作用