我正在使用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做同样的事情?
提前致谢。