10

设置

我正在从事一个涉及大量 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 用户列表中此人的指示,这种情况仍然存在。

4

3 回答 3

9

最好的选择是将对象图呈现为深度 JSONXML(使用普通 JSON 或 XML 转换器无法实现)。Grails 提供的转换器可以有效地将对象图解析为人类可读的形式,并且对于在 Web 服务调用中呈现响应也很有用。下面是一个关于如何将对象图呈现为有效 JSON 对象或 XML 的详细示例。

用例:
考虑一个对象图,例如:

Parenthas Child, name, dob, age
Child有 name, dob, ageGrandChild并且有很多Qualities
GrandChildhas Address, blah, blah 等


可以在此处找到使用带输出的域对象的示例详细信息示例。
可以在此处找到使用带有输出的 POGO 的详细示例

关键领域:
重点关注的关键领域是控制器方法,其中所有Parent的s都被获取并序列化为JSON或XML

//Parent Controller
import grails.converters.JSON
import grails.converters.XML
def index() {
        JSON.use('deep')
        render Parent.all as JSON

        //XML.use('deep')
        //render Parent.all as XML
    }

推论:
Grails 转换器也可用于普通 POGO 对象图,并且不仅限于域对象。您可以将响应写入输出流日志附加程序http 响应,您可以在所有情况下实现对象图从根节点到叶节点的深度序列化。

上面提到的示例将清楚地说明输出格式的外观。

使用Grails 2.2.2编写和测试的示例应用程序。

于 2013-06-28T06:22:36.973 回答
3

您可以尝试使用将对象呈现为 JSON,而不是使用使其隐式调用 toString()。我认为它会正确渲染对象的结构。

于 2013-06-27T23:36:43.747 回答
0

Groovy 的 Object 类有一个方法dump()。它在这里描述 http://docs.groovy-lang.org/docs/latest/html/groovy-jdk/java/lang/Object.html#dump()

我没用过,希望对你有帮助。

于 2013-06-25T17:05:34.040 回答