微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我不能使用指定的命名配置将对象呈现为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 = {
    }
}

然后我有一个经典的控制器(不是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
        })

    }

}

我希望调用check动作只会输出apiCheck命名配置中指定的三个属性,而是获得所有bean属性以及MetaClass属性“class”和“id”.

如果我没有指定命名配置,那么JSON正确呈现只显示三个属性的bean.

怎么了?是否可以在非REST控制器中使用namedConfig

解决方法:

DefaultConverterConfiguration作为带有认配置的JSON作为参数传递给闭包.因此,关闭必须如下实施(注意关闭的参数).

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
         ]
     }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐