セットアップ:
多くの XML データ転送を含む Grails プロジェクトに取り組んでいます。Apache CXFの wsdl2java ユーティリティを使用して、データ形式に適した Java クラスを生成しています。
XML の結果の一部をキャッシュしていますが、コード内の特定のポイントで特定の値を既にキャッシュしているかどうかを確認する必要があります (これは以前に発生したことがあります)。
私が探しているもの:
ランダムなオブジェクトを再帰的にダンプする方法。
私がこれまでに試したこと:
1) println() -- これは、文字列や整数などの基本型を持つハッシュマップではうまく機能しますが、一般的なオブジェクトでは失敗します。「com.company.services.provider.ADDRESS@2b1234ca1」のような wsdl2java クラスの .toString() 出力を出力します。これは自動生成されたクラスであるため、そのメソッドを簡単に置き換えることはできません。
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 ユーザー リストでこの個人の指示に従っているにもかかわらず、持続します。