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

Posted

技术标签:

【中文标题】控制器中每个操作的 JSON Marshaller (Grails)【英文标题】:JSON Marshaller for each action in controller (Grails) 【发布时间】:2015-03-19 22:19:43 【问题描述】:

在 grails 中,如何为控制器中的每个操作设置 JSON.registerObjectMarshaller。

这是一个例子

我的User 域对象:

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

【问题讨论】:

你想做什么?为什么每个控制器操作都需要一个?你试过什么?您尝试过的方法有什么问题? 为什么不直接返回一张包含内容的地图? @cfrick 感谢您的编辑... 【参考方案1】:

虽然对于简单的域来说这可能有点矫枉过正,而且您可能只需返回数据的 Map 就可以逃脱惩罚,但这个问题仍然有效。

如何注册自定义命名编组器?

通常,您将在您的 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
    
  

上面使用了命名的 marshllers,它允许您控制在创建最终 JSON 输出时将使用哪种 JSON 表示(实际上只是 Map)。

希望这会有所帮助,并原谅我在脑海中写下的任何拼写错误。

【讨论】:

感谢回复我尝试了您的 action2() 代码,它工作正常。但是对于 action1() 我从用户域中获取所有字段。 JSON.createNamedConfig("clientView", JSON.registerObjectMarshaller(User) User o -> return [ username: o.username, firstName: o.firstName, lastName: o.lastName ] ) 为了测试我在引导程序中添加了这个,现在我用 JSON.use("userOtherView") 调用了 action2() 但我得到了 json "username":"xyz.com","firstName":"ABC","lastName ":"管理员" 它是缓存我们可以对任何东西删除缓存

以上是关于控制器中每个操作的 JSON Marshaller (Grails)的主要内容,如果未能解决你的问题,请参考以下文章

JAXB XJC 代码生成 - Marshaller 生成的 xml 中缺少“schemaLocation”

如何在一个Jaxb2Marshaller中处理更多的WSDL?

对于jaxb-impl 2.2.11,com.sun.xml.bind.marshaller软件包中没有名为CharacterEscapeHandler的类存在

xml com.sun.xml.internal.bind.marshaller不存在

求助Matlab Error: Java exception occurred

spray-json 无法编组 Map[String,String]