2016-06-08 84 views
1

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

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

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

回答

1

我不知道你是在谈论这一点,但你可以忽略某些属性,当您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 
    } 
} 

你可以把它放在你认为它更好地其实我更喜欢把它放在课堂上,我正在重写,因为信我能找到它,或者如果另外一个人它正在查看代码,他/她可以轻松找到它。

+0

这是正确的想法,但我不想为我的Grails项目中的每个域类注册一个编组器或一个渲染器。从API的角度来看,我认为任何设计任何API的公司都不希望在响应中包含'class'属性,所以我很惊讶没有一个全球性的单线程可以摆脱这个无关的域应对机构。 –

2

似乎没有任何好的方法来做到这一点。我发现,如果你注册一个超类的排除,所有的子类也“继承”排除。所以为了摆脱的所有 Groovy对象(它覆盖所有域类),我添加了以下bean到resources.groovy

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