设置:
我正在从事一个涉及大量 XML 数据传输的 Grails 项目。我们正在使用Apache CXF的 wsdl2java 实用程序为数据格式生成适当的 Java 类。
我们正在缓存一些 XML 结果,我需要确定我们是否已经在代码中的特定点缓存了特定值(这种情况以前发生过)。
我在找什么:
一种递归转储随机对象的方法。
到目前为止我所尝试的:
1) println() - 这适用于具有基本类型(如字符串和整数)的哈希图,但在泛型对象上失败。它输出 wsdl2java 类的 .toString() 输出,类似于“com.company.services.provider.ADDRESS@2b1234ca1”。由于这是一个自动生成的类,我们不能轻易地替换该方法。
2)这里概述的方法:http: //padcom13.blogspot.com/2009/12/groovy-dumping-objects-properties.html
我已经将它包装在一个函数中,并将它添加到 BootStrap.groovy 中的 Object.metaClass 中。这允许它被递归调用;然而,似乎只有大约一半的 wsdl2java 类继承了这个函数(用“println(obj.metaClass.metaMethods*.name.sort())”验证)。他们都没有明确扩展 Object 所以我迷路了。
递归转储随机对象的属性(最好是人类可读的)的最干净的方法是什么?
提前致谢!
编辑:
非常感谢 @dmahapatro 和 @JavaDev 的想法。这是我现在正在查看的代码:
import grails.converters.JSON
Object.metaClass.debug_dump = {
JSON.use('deep')
println(new JSON(delegate).toString())
}
...
session.cxfResult.debug_dump()
这是它在运行时产生的错误:
Class org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller can not access a member of class org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl with modifiers "public". Stacktrace follows:
Message: Class org.codehaus.groovy.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller can not access a member of class org.apache.xerces.jaxp.datatype.XMLGregorianCalendarImpl with modifiers "public"
尽管遵循Grails 用户列表中此人的指示,这种情况仍然存在。