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


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!