【问题标题】:Exclude properties from rendering for all Grails domain classes从所有 Grails 域类的渲染中排除属性
【发布时间】:2016-06-08 02:58:04
【问题描述】:

Grails 2.5.4 docs 表示可以将属性从整个域类组的渲染中排除。

有一些默认配置的渲染器以及注册或覆盖给定域类甚至域类集合的渲染器的能力。

但是文档中没有给出如何执行此操作的示例。有谁知道如何排除我所有域类的属性?具体来说,我试图摆脱 Grails 自动添加到响应正文中的 classenumType 字段。

【问题讨论】:

    标签: json rest grails


    【解决方案1】:

    似乎没有什么好的方法可以做到这一点。我发现,如果您为超类注册排除项,所有子类也会“继承”该排除项。因此,为了摆脱 all Groovy 对象(涵盖所有域类)的四个属性,我将以下 bean 添加到 resources.groovy

    groovyObjectJsonRenderer(JsonRenderer, GroovyObject) {
        excludes = ['class', 'declaringClass', 'errors', 'version']
    }
    

    【讨论】:

      【解决方案2】:

      我不知道你是不是在说这个,但是你render as JSON时可以忽略一些属性,覆盖Marshaller这里是代码:

      static {
          grails.converters.JSON.registerObjectMarshaller(NAMEOFYOURCLASS) {
          return it.properties.findAll {k,v -> k != 'class' && k!='declaringClass'}
          }
      }
      

      或者如果你想创建自定义渲染,你可以这样做

      static {
          grails.converters.JSON.registerObjectMarshaller(NAMEOFYOURCLASS) {
              def lista = [:]
              lista['id'] = it.id
              lista['name'] = it.name
              lista['dateCreated'] = it.date?.format("dd/MM/yyyy HH:mm")
              return lista
          }
      }
      

      你可以把它放在你认为更好的地方,我实际上更喜欢把它放在我覆盖的类中,因为我可以找到它,或者如果其他人正在寻找代码,他/她可以很容易地找到它。

      【讨论】:

      • 这是正确的想法,但我不想为我的 Grails 项目中的每个域类注册一个编组器或一个渲染器。从 API 的角度来看,我认为任何设计任何 API 的公司都不会希望在响应中包含 class 属性,所以我很惊讶没有一个全球性的单线来摆脱这个无关的领域响应机构。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2023-03-10
      • 2019-08-15
      • 1970-01-01
      相关资源
      最近更新 更多