Grails休息从其他控制器渲染src / groovy类作为JSON并创建自定义JSON渲染器

时间:2016-02-12 09:42:06

标签: json rest grails grails-2.5

我正在使用grails 2.5.0。 我想将src/groovy类呈现为JSON和自定义JSON。如果我对域类执行相同的操作,它对我来说工作正常。我想要src / groovy类同样的东西。 为了使用json和自定义json渲染数据,我遵循了link

我试过这些东西。 在src / groovy中创建pogo类。

class UserDTO {
    String username
    String lastName
    String firstName
    String email
}

创建一个具有宁静功能的控制器。

import grails.converters.JSON
import grails.rest.RestfulController

class RenderDTOController extends RestfulController {

    static responseFormats = ['json','pogoshort','pogodetails']
    RenderDTOController() {
        super(UserDTO)
    }


    def index() {
        respond new UserDTO(username: "vivek", firstName: "Vivek", lastName: "Yadav")
    }
}

在urlMapping.groovy上输入。

"/vivek"(resources:'renderDTO')

在resources.groovy中为自定义渲染器注册了新的mime类型。

userPogoDetailsRenderer(JsonRenderer, UserDTO) {

    mimeTypes = [new MimeType('application/vnd.grails.rest.sample.pogodetails+json', 'pogodetails')]

    namedConfiguration = 'pogodetails'
}
output.
userPogoShortRenderer(JsonRenderer, UserDTO) {
    mimeTypes = [new MimeType('application/vnd.grails.rest.sample.pogoshort+json', 'pogoshort')]

    namedConfiguration = 'pogoshort'
}

userPogoRenderer(JsonRenderer, UserDTO) {
    mimeTypes = [new MimeType('application/json', 'json')]
} 

以mime类型添加了新的mime类型。

grails.mime.types = [ // the first one is the default format
                      all          : '*/*', // 'all' maps to '*' or the first available format in withFormat
                      atom         : 'application/atom+xml',
                      css          : 'text/css',
                      csv          : 'text/csv',
                      form         : 'application/x-www-form-urlencoded',
                      html         : ['text/html', 'application/xhtml+xml'],
                      js           : 'text/javascript',
                      json         : ['application/json', 'text/json'],
                      multipartForm: 'multipart/form-data',
                      rss          : 'application/rss+xml',
                      text         : 'text/plain',
                      hal          : ['application/hal+json', 'application/hal+xml'],
                      xml          : ['text/xml', 'application/xml'],
                     pogodetails      : ['application/vnd.grails.rest.sample.pogodetails+json', 'application/json'],
                      pogoshort     : ['application/vnd.grails.rest.sample.pogoshort+json', 'application/json']
] 

在Bootstrap.groovy中添加了自定义编组程序。

JSON.createNamedConfig("pogodetails") {
        println "pogodetails renderer in bootstrap"
        it.registerObjectMarshaller(UserDTO) { UserDTO user ->
            final String fullname = [user.firstName, user.lastName].join(' ')
            final userMap = [
                    lastName      : user.lastName,
                    username: user.username,
                    email   : user.email,
            ]
            if (fullname) {
                userMap.fullname = fullname
            }
            userMap
        }
    }

    JSON.createNamedConfig('pogoshort') {
        println "pogoshort renderer in bootstrap"
        it.registerObjectMarshaller(UserDTO) { UserDTO user ->
            println "Coming here in pogoshort renderer"
            final userMap = [
                    lastName      : user.lastName,
                    username: user.username
            ]
            userMap
        }
    }

在我跑步的时候,我得到了例外。

URI
/grails-rest-2.5.0/vivek
Class
org.codehaus.groovy.runtime.typehandling.GroovyCastException
Message
Cannot cast object 'com.vivek.UserDTO@12c671a2' with class 'com.vivek.UserDTO' to class 'grails.converters.JSON'

如果我改变了这样的控制器。

respond new UserDTO(username: "vivek", firstName: "Vivek", lastName: "Yadav").encodeAsJSON()

我可以将其转换为JSON格式。 另外,如果用户使用这种语法。

JSON.use("pogodetails")
respond new UserDTO(username: "vivek", firstName: "Vivek", lastName: "Yadav").encodeAsJSON()

我也能以自定义格式渲染pogo。但是我需要这样做,因为完全控制器正在为doamin做。

有没有办法用src / groovy目录中定义的简单POGO做同样的事情?

提前致谢。

0 个答案:

没有答案