Grails: Wie dump, der die Eigenschaften eines Objekts?
Das setup:
Arbeite ich an einem Grails-Projekt, das erfordert eine Menge von XML-Daten überträgt. Wir sind mit Apache CXF's wsdl2java" zum generieren der entsprechenden Java-Klassen für die Daten-Formate.
Sind wir Zwischenspeicherung einige der XML-Ergebnisse, und ich brauche, um herauszufinden, ob wir haben bereits zwischengespeichert, die einen bestimmten Wert an einem bestimmten Punkt im code (dies ist schon vorgekommen).
, Was ich bin auf der Suche nach:
Einen Weg, um rekursiv dump zufällige Objekte.
Was ich bisher versucht habe:
1) println() -- Dies funktioniert gut für hashmaps mit den grundlegenden Datentypen wie Strings und zahlen, aber nicht auf generische Objekte. Es gibt das wsdl2java-Klasse .toString () - Ausgabe, die ähnelt "com.company.services.provider.ADDRESS@2b1234ca1." Denn dies ist eine automatisch generierte Klasse, wir können nicht ersetzen, dass die Methode einfach.
2) Die Methode, die hier beschrieben werden: http://padcom13.blogspot.com/2009/12/groovy-dumping-objects-properties.html
Ich haben verpackt diese in eine Funktion Hinzugefügt, die es dem Objekt zu.metaClass in BootStrap.groovig. Das ermöglicht es, werden rekursiv aufgerufen, aber nur etwa die Hälfte der wsdl2java Klassen scheinen übernehmen diese Funktion (überprüft mit "println(obj.Metaklasse.metaMethods*.name.sort())"). Keiner von Ihnen explizit verlängern Objekt, so bin ich verloren.
Was ist der sauberste Weg, um rekursiv dump ein random-Objekt die Eigenschaften (vorzugsweise human-readable)?
Vielen Dank im Voraus!
BEARBEITEN:
Vielen Dank an @dmahapatro und @JavaDev für Ihre Ideen. Hier ist der code, den ich auf der Suche bin und jetzt:
import grails.converters.JSON
Object.metaClass.debug_dump = {
JSON.use('deep')
println(new JSON(delegate).toString())
}
...
session.cxfResult.debug_dump()
- Und das ist der Fehler, den es erzeugt, wenn Sie ausgeführt wird:
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"
Diese besteht trotz der nach den Anweisungen von dieser Person, auf dem Grails-Benutzer-Liste.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, verwenden Sie zum Rendern des Objekt als JSON anstelle von wodurch es implizit rufen Sie toString(). Ich denke, es macht die Struktur des Objekts richtig.
Beste Möglichkeit wäre, das Objekt Rendern, Grafik tief JSON oder XML (nicht erreichen kann mit normalen JSON-oder XML-Konverter).
Grails bietet Wandler, die effektiv analysiert das Objektdiagramm in eine lesbare form und ist auch nützlich für das Rendern der Antwort in der webservice-Aufrufe. Unten ein ausführliches Beispiel, wie ein Objektdiagramm dargestellt werden kann, entweder ein gültiges JSON-Objekt oder eine XML.
Anwendungsfall:
Betrachten Sie ein Objekt-graph wie:
Parent
hatChild
, name, Geburtsdatum, AlterChild
hat name, Geburtsdatum, Alter,GrandChild
und hat vieleQualities
GrandChild
hatAddress
bla bla etcProbe
Detail-Beispiel Verwendung von Domänen-Objekten mit Ausgaben finden Sie hier.
Detail Beispiel mit POGOs mit Ausgaben finden Sie hier
Key Bereich:
Den wichtigsten Bereich zu konzentrieren, ist die controller-Methode, wo alle
Parent
s abgerufen werden und serialisiert als JSON-oder XML -Inferenz:
Grails-Wandler kann auch verwendet werden, für die normale POGO-Objekt-Graphen und sind nicht nur beschränkt auf domain-Objekte. Sie können entweder schreiben die Antwort auf eine out stream, log appender oder eine http-Antwort, Sie könnte erreichen die Tiefe Serialisierung der Objekt-graph von der Wurzel zum Blattknoten in allen Fällen.
Beispiel erwähnt oben würden deutlich machen, wie das format Aussehen würde.
Beispiel-apps geschrieben und getestet mit Grails 2.2.2.
JSON.use('deep')
funktionierte wie ein Charme. Danke!deep
config. Sie müssen diese Zeile auf jeden Fall, sonst werden Sie nicht bekommen, was Sie wollen. Ich weiß, tief-Wandler sind veraltet. Sie gehen durchgrails.converters.deep.JSON
. Halten Sie einen Hinweis auf die import-Anweisungen. Versuchen Sie, eine Probe-Projekt ohneJSON.use
werden Sie nicht bekommen rekursiven Eigenschaften. BTW alle meine Proben sind geschrieben und getestet in Grails 2.2.2. 🙂JSON.use('deep')
wird nicht verwendet. Wieder besuchen die Proben Zeile für Zeile. 🙂JSON.use('deep')
im code. Ohne, dass die meisten Daten, die gerendert wird, aber ich hatte nicht überprüft, dass alle Informationen, die gibt es noch. Haben Sie irgendwelche Gedanken darüber?as JSON
.JSON.use('deep')
wird erforderlich sein, wenn Verbände beteiligt sind, in der domain-Klasse. Versuchen zu laufen, meine erste Probe, in der domain-Objekte verwendet werden, ohne tief werden Sie nicht in der Lage zu bekommen, um die zugehörigen domain-Objekte. Ich hoffe, das hilft.Groovy die Klasse Object hat eine Methode
dump()
. Es hier beschriebenhttp://groovy.codehaus.org/groovy-jdk/java/lang/Object.html#dump()
Ich es nie benutzt, aber ich hoffe es wird Euch helfen.
<com.company.services.provider.DATARESP@1a2a03c2 header=com.company.services.provider.HEADER@5321c1b2 datars=com.company.services.provider.DATARS@b134c6ad fee=null paymentsourcevalue=>