【问题标题】:How to exclude params from XML rendered in Grails?如何从 Grails 中呈现的 XML 中排除参数?
【发布时间】:2010-05-14 09:58:05
【问题描述】:

我有课:

class Category {
  String name
  SortedSet items
  static hasMany = [items:Item]
}

在控制器内部,我将类别呈现为 XML(转换器):

   def getCategory = {
     render Category.read(1) as XML
   }

但我想从渲染中排除项目。

我该怎么办?

谢谢

【问题讨论】:

  • 我知道可以使用 render(contentType(text/xml) 并手动创建 xml 内容,但这并不优雅。也许存在另一种方法(配置文件,SpringBean,...)跨度>

标签: ajax grails


【解决方案1】:

您可以简单地返回一个Map,只包含您想要包含的属性:

def getCategory = {
    def category = Category.read(1)
    render [ id: category.id, name: category.name ] as XML
}

【讨论】:

  • 不是很优雅。因为如果我有藏书,我必须迭代。 Book.list().each{ ... }
  • 但这是更好的解决方案。谢谢
  • 你应该使用 collect() 方法,而不是 each()。例如: Book.list().collect{ book -> [ name: book.name ] } as XML
【解决方案2】:

您需要创建类似于视图的第二个域类并配置映射,使其具有与Category 类相同的表

查看此线程的完整答案:How to restrict visibility of domain properties in grails?

法比恩。

【讨论】:

  • 为什么不呢。但是,如果我可以为我的对象配置一组 xml 视图,那就更优雅了。您的解决方案是一个技巧,但并不是真正面向对象的。为什么不创建包装器: XMLView(object){ static view1 = { object.params1 object.params2 } static view2 = { object.params2 object.params3 } } 我可以在 jira codehaus 上为此创建一个问题吗?非常感谢。
【解决方案3】:

另一种选择是使用marshallers plugin。它允许您在对象本身或其他地方定义自定义编组器。例如:

class Category {
  String name
  SortedSet items
  static hasMany = [items:Item]
  static marshallers {
    shouldOutputIdentifier false
    shouldOutputVersion false
    shouldOutputClass false
    elementName 'category'
    attribute 'name'
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2016-08-16
    • 2021-07-16
    相关资源
    最近更新 更多