Ответ 1
Вы можете попробовать использовать для визуализации объекта как JSON вместо того, чтобы использовать его для неявного вызова toString(). Я думаю, что он правильно отобразит структуру объекта.
Настройка:
Я работаю над проектом Grails, который включает в себя множество передач XML-данных. Мы используем утилиту Apache CXF wsdl2java для создания соответствующих классов Java для форматов данных.
Мы кэшируем некоторые из результатов XML, и мне нужно выяснить, если мы уже кэшировали определенное значение в определенной точке кода (это было раньше).
Что я ищу:
Способ рекурсивного сброса случайных объектов.
То, что я пробовал до сих пор:
1) println() - Это хорошо работает для хэшмапов с базовыми типами, такими как строки и целые числа, но не работает с общими объектами. Он выводит вывод wsdl2java.toString(), который напоминает "[email protected]". Поскольку это автоматически сгенерированный класс, мы не можем легко заменить этот метод.
2) Метод, описанный здесь: http://padcom13.blogspot.com/2009/12/groovy-dumping-objects-properties.html
Я обернул это в функцию и добавил его в Object.metaClass в BootStrap.groovy. Это позволяет называть его рекурсивно; однако только половина классов 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.
Вы можете попробовать использовать для визуализации объекта как JSON вместо того, чтобы использовать его для неявного вызова toString(). Я думаю, что он правильно отобразит структуру объекта.
Самый лучший вариант - отобразить граф объектов как глубокий JSON или XML (невозможно добиться с помощью обычных JSON или XML-преобразователей). Grails предоставляет преобразователи, которые эффективно анализируют граф объектов в форме, удобной для пользователя, и также полезны для отклика ответа в вызовах webservice. Ниже приведен подробный пример того, как графический объект может быть отображен либо в действительный объект JSON, либо XML.
Пример использования:
Рассмотрим граф объекта как:
Parent
имеет Child
, имя, dob, возраст Child
имеет имя, dob, age, GrandChild
и имеет много Qualities
GrandChild
имеет Address
, blah, blah и т.д.
Пример
Подробный пример с использованием объектов домена с выходами можно найти здесь.
Подробный пример с помощью POGO с выходами можно найти здесь
Ключевые области:
Ключевой областью, на которую следует сосредоточиться, является метод контроллера, где все 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 и не ограничиваются объектами домена. Вы можете либо написать ответ на исходящий поток, либо в приложение журнала, либо в ответ на http, вы можете добиться глубокой сериализации графа объекта от root до листа node во всех случаях.
Пример, упомянутый в выше, даст понять, как выглядит формат вывода.
Примеры приложений, написанных и протестированных с помощью Grails 2.2.2.
Groovy Класс объекта имеет метод dump()
. Здесь описано
http://groovy.codehaus.org/groovy-jdk/java/lang/Object.html#dump()
Я никогда не использовал его, но надеюсь, что это поможет вам.