控制器中每个操作的JSON封送器(Grails)
在grails中,如何为控制器中的每个操作使用JSON.registerObjectMarshaller 这里有一个例子 我的用户域对象:控制器中每个操作的JSON封送器(Grails),json,grails,groovy,Json,Grails,Groovy,在grails中,如何为控制器中的每个操作使用JSON.registerObjectMarshaller 这里有一个例子 我的用户域对象: String username String empId String attendanceID String password String firstName 在我的控制器中: def myaction1() { def user=User.getAll() // XXX here i want to return just usern
String username
String empId
String attendanceID
String password
String firstName
在我的控制器中:
def myaction1() {
def user=User.getAll()
// XXX here i want to return just username and empId
render user as JSON
}
def myaction2() {
def user=User.getAll()
// XXX here i want to return just username and firstName
render user as JSON
}
虽然这对于简单域来说可能有点过分,而且您可能只返回数据的地图就可以逃脱,但这个问题仍然有效 如何注册自定义命名封送员 通常,如果您想保持整洁,您将在grails app/conf/BootStrap.groovy或新文件grails app/conf/CustomMarshallersBootStrap.groovy中执行此操作。这方面的一个示例可能如下所示:
// Bootstrap.groovy
import grails.converters.JSON
import com.example.User
class BootStrap {
def init = { servletContext ->
JSON.createNamedConfig("userEmployeeView", {
JSON.registerObjectMarshaller(User) { User o ->
return [
username: o.username,
empId: o.empId
]
}
})
JSON.createNamedConfig("userOtherView", {
JSON.registerObjectMarshaller(User) { User o ->
return [
username: o.username,
firstName: o.firstName
]
}
})
}
def destroy = { }
}
// UserController.groovy
package com.example
import grails.converters.JSON
class UserController {
def action1() {
def users = User.getAll()
JSON.use("userEmployeeView") {
render users as JSON
}
}
def action2() {
def users = User.getAll()
JSON.use("userOtherView") {
render users as JSON
}
}
}
这将注册两个命名封送拆收器,您可以在控制器中使用它们,如下所示:
// Bootstrap.groovy
import grails.converters.JSON
import com.example.User
class BootStrap {
def init = { servletContext ->
JSON.createNamedConfig("userEmployeeView", {
JSON.registerObjectMarshaller(User) { User o ->
return [
username: o.username,
empId: o.empId
]
}
})
JSON.createNamedConfig("userOtherView", {
JSON.registerObjectMarshaller(User) { User o ->
return [
username: o.username,
firstName: o.firstName
]
}
})
}
def destroy = { }
}
// UserController.groovy
package com.example
import grails.converters.JSON
class UserController {
def action1() {
def users = User.getAll()
JSON.use("userEmployeeView") {
render users as JSON
}
}
def action2() {
def users = User.getAll()
JSON.use("userOtherView") {
render users as JSON
}
}
}
上面使用了命名的marshllers,它允许您控制在创建最终JSON输出时实际使用的JSON表示
希望这能有所帮助,请原谅我在头上写下这篇文章时的任何拼写错误。你想做什么?为什么每个控制器操作都需要一个控制器?你试过什么?您尝试过的东西有什么不起作用?为什么不返回一个包含内容的地图?@cfrick感谢您的编辑…谢谢您的回复我尝试了您的操作代码2。它工作正常。但是对于操作1,我将从user domain.JSON.createNamedConfigclientView,{JSON.registerObjectMarshallerUser{user o->return[username:o.username,firstName:o.firstName,lastName:o.lastName]}获取所有字段为了测试,我在bootstrap中添加了这个,现在我用JSON.useuserOtherView调用了action2,但是我得到了JSON{username:xyz.com,firstName:ABC,lastName:Admin}它正在缓存,我们可以删除任何缓存吗