Epi*_*age 10 debugging grails cxf object
设置:
我正在开发一个涉及大量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()
Run Code Online (Sandbox Code Playgroud)
这是运行时产生的错误:
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"
Run Code Online (Sandbox Code Playgroud)
尽管遵循Grails用户列表中此人的指示,这仍然存在.
最好的选择是将对象图呈现为深 JSON或XML(使用普通的JSON或XML转换器无法实现).Grails提供了有效地将对象图解析为人类可读形式的转换器,并且对于在webservice调用中呈现响应也很有用.下面是如何将对象图呈现给有效的JSON对象或XML的详细示例.
使用案例:
考虑一个对象图,如:
Parent有Child,名字,dob,年龄
Child有名字,dob,年龄,GrandChild并且有许多Qualities
GrandChild有Address,等等,等等
可以在此处找到使用带输出的域对象的示例详细示例.
可以在此处找到使用带输出的POGO的详细示例
关键领域:
要关注的关键领域是控制器方法,其中所有Parents都被提取并序列化为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
}
Run Code Online (Sandbox Code Playgroud)
推论:
Grails转换器也可以用于普通的POGO对象图,不仅仅局限于域对象.您可以将响应写入out stream,log appender或http响应,在所有情况下都可以实现从root到leaf节点的对象图的深度序列化.
上面提到的例子将清楚地说明out格式的外观.
使用Grails 2.2.2编写和测试的示例应用程序.
| 归档时间: |
|
| 查看次数: |
7254 次 |
| 最近记录: |