【问题标题】:Grails 2.4 named configuration for JSON not workingJSON的Grails 2.4命名配置不起作用
【发布时间】: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?

【问题讨论】:

    标签: json spring grails groovy


    【解决方案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 不用担心。很高兴知道您阅读了文档。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    相关资源
    最近更新 更多