Подтвердить что ты не робот

Grails: Как сбросить свойства объекта?

Настройка:

Я работаю над проектом 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.

4b9b3361

Ответ 1

Вы можете попробовать использовать для визуализации объекта как JSON вместо того, чтобы использовать его для неявного вызова toString(). Я думаю, что он правильно отобразит структуру объекта.

Ответ 2

Самый лучший вариант - отобразить граф объектов как глубокий 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.