控制器中每个操作的JSON封送器(Grails)

控制器中每个操作的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

在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 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}它正在缓存,我们可以删除任何缓存吗