Grails:如何转储对象的属性?

时间:2013-06-25 16:28:10

标签: debugging object grails cxf

设置

我正在开发一个涉及大量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"

尽管遵循了of this individual on the Grails user list的指示,但仍然存在。

3 个答案:

答案 0 :(得分:9)

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

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

ParentChild,姓名,dob,年龄
Child有姓名,dob,年龄,GrandChild并且有很多Qualities GrandChildAddress,等等,等等。

<强>示例
Detail example using domain objects with outputs can be found here
Detail example using POGOs with outputs can be found here

关键区域:
要关注的关键领域是控制器方法,其中所有Parent被提取并序列化为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对象图,并且不仅限于域对象。您可以将响应写入 out stream log appender http响应,您可以实现对象图的深度序列化在所有情况下从根节点到叶节点。

above中提到的示例将明确表示外部格式的外观。

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

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

我从未使用它,但希望它能帮到你。