在Grails 2.3.5中编码到XML时,我希望从XML中排除null属性。
目前这样的代码
if ( myObj.someProp == null ) log.info("yeap, it's null")
render myObj as XML
将输出“是,它为空”到日志,然后呈现看起来像的XML
<myObj>
<someProp />
</myObj>
但是我想要的是
<myObj>
</myObj>
或简单地(如果不存在其他属性)
<myObj />
可以将Grails配置为从编码中排除空属性吗?
另外,使用
def xml = myObj as XML
if ( myObj.someProp == null ) {
xml.excludes = ["someProp"]
}
render xml
并非在所有情况下都有效,因为有时是
results列表,其中列表中的项目可能具有null属性。
更新
我通过将以下代码添加到
BootStrap.groovy中来尝试了@dmahapatro的建议
XML.registerObjectMarshaller(MyObj) {
it.properties.findAll { it.value != null }
}
带有适当的导入语句。
结果是不正确的XML:
<myObj>
<entry key="someProp">non-null value</entry>
</myObj>
现在,属性不再是标记的名称。而是使用通用的“entry”标签,因为Grails看到的是Map而不是域对象。
请您参考如下方法:
您可以使用 registerObjectMarshaller 修改该行为。
//Bootstrap.groovy
import grails.converters.XML
import my.package.MyObj
XML.registerObjectMarshaller(MyObj) {
it.properties.findAll { it.value != null }
}
更新
为了避免由于域类的 map 表示而导致进入标签,可以将对象编码器轻松转换为预期结果,如下所示:
XML.registerObjectMarshaller(Author) {obj, xml ->
xml.attribute 'id', "$obj.id"
xml.build {
obj.properties.each {
if(it.value != null) {
"$it.key" it.value
}
}
}
}




