10

セットアップ:

多くの 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 ユーザー リストでこの個人の指示に従っているにもかかわらず、持続します。

4

3 に答える 3

9

考えられる最良のオプションは、オブジェクト グラフを深い JSONまたはXMLとしてレンダリングすることです(通常の JSON または XML コンバーターでは実現できません)。Grails は、オブジェクト グラフを人間が読める形式に効果的に解析し、Web サービス呼び出しで応答をレンダリングするのにも役立つコンバーターを提供します。以下は、オブジェクト グラフを有効な JSON オブジェクトまたは XML にレンダリングする方法の詳細な例です。

ユース ケース:
次のようなオブジェクト グラフを考えてみましょう。

Parenthas Child, name, dob, age
Childhas name, dob, age, GrandChildand has many Qualities
GrandChildhas Address, blah, blah etc


ドメインオブジェクトと出力を使用したサンプル詳細の例は、ここにあります。
出力で POGO を使用した詳細な例は、ここにあります。

重要な領域:注目すべき重要な領域は、すべての s がフェッチされ、JSON または XML としてシリアル化される
コントローラー メソッドです。Parent

//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

暗黙的に toString() を呼び出す代わりに、JSON としてオブジェクトをレンダリングするために使用を試みることができます。オブジェクトの構造を適切にレンダリングすると思います。

于 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 に答える