gpt4 book ai didi

grails - 如何从使用Grails XML marshaller编码中排除空属性

转载 作者:行者123 更新时间:2023-12-02 14:24:27 26 4
gpt4 key购买 nike

在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
}
}
}
}

关于grails - 如何从使用Grails XML marshaller编码中排除空属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21788719/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com