2013-06-25 3 views
10

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

Я работаю над проектом Grails, который включает в себя много передачи данных XML. Мы используем утилиту wsdl2java для создания соответствующих классов Java для форматов данных.

Мы кэшируем некоторые из результатов XML, и мне нужно выяснить, было ли у нас уже кэшированное определенное значение в определенной точке кода (это произошло раньше).

Я ищу:

Способ рекурсивно дамп случайных объектов.

То, что я пытался до сих пор:

1) Println() - Это хорошо работает для HashMaps с основными типами как струнные и Целыми, но не работает на общих объектах. Он выводит вывод .toString() класса wsdl2java, который напоминает «[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, поэтому я потерян.

Каков самый чистый способ рекурсивно сбрасывать свойства случайного объекта (желательно для человека)?

Заранее благодарен!

EDIT:

Большое спасибо @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" 

Это сохраняется, несмотря на следующие направления of this individual on the Grails user list.

ответ

3

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

+0

Это чувствует хак-иш, но «переменная, как JSON», кажется, правильно отображает структуру. Почему я не подумал об этом? Благодаря! – EpicVoyage

1

Класс объекта Groovy имеет метод dump(). Здесь описано http://groovy.codehaus.org/groovy-jdk/java/lang/Object.html#dump()

Я никогда не использовал его, но надеюсь, что это вам поможет.

+0

Метод .dump(), как представляется, вызывает свойства .toString() для свойств объекта. Это выглядит примерно так: '<[email protected] [email protected] [email protected] fee = null paymentsourcevalue => ' – EpicVoyage

+3

Просто для пояснения: метод .dump() не рекурсивный вообще, поэтому он не будет работать. Благодарю. – EpicVoyage

9

Лучший возможный вариант был бы для визуализации графа объектов, как глубокоJSON или XML (не может достичь с помощью обычных JSON или XML-конвертеров). Grails предоставляет преобразователи, которые эффективно анализируют графа объектов в форме, удобной для человека, и также полезны для рендеринга ответа в вызовах webservice. Ниже приведен подробный пример того, как графический объект может быть отображен либо в действительный объект JSON, либо в XML.

Use Case:
Рассмотрим граф объектов, как:

Parent имеет Child, имя, дата рождения, возраст
Child имеет имя, DOB, возраст, GrandChild и имеет много Qualities
GrandChild имеет Address , бла, бла и т. д.

Образец
Detail example using domain objects with outputs can be found here.
Detail example using POGOs with outputs can be found here

Key Область:
Основное направление сосредоточиться на методе управления, где все Parent s выбираются и сериализованные в 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 и не ограничиваются только объектами домена. Вы можете либо ответить на сообщение out stream, log appender или ответ http, вы можете добиться глубокой сериализации графа объектов от корневого до листового узла во всех случаях.

В примере, указанном в above, будет ясно указано, как будет выглядеть внешний формат.

Примеры приложений, написанных и протестированных с использованием Grails 2.2.2.

+0

Отличный ответ, поэтому я награждаю вас щедростью. Я не упомянул о версии Grails, но кажется, что глубокие конвертеры [теперь устарели] (http://grails.org/Converters+Reference) в 2.x. Как только я удалил 'JSON.use ('deep')', это работало как шарм. Благодаря! – EpicVoyage

+0

@ PegLeg3941 Я не использовал глубокий конвертер. Я использовал обычный конвертер с конфигурацией 'deep'. Вам понадобится эта строка, иначе вы не получите то, что хотите. Я знаю, что глубокие конвертеры устарели. Они идут на 'grails.converters.deep.JSON'. Сохраните примечание к операторам импорта. Попробуйте запустить образец проекта без 'JSON.use', вы не получите рекурсивных свойств. BTW все мои образцы написаны и протестированы в Grails 2.2.2. :) – dmahapatro

+0

@ PegLeg3941 Также см. Результат в каждом из образцов в deatail, который он рекурсивно показывает каждое из свойств. Я очень сомневаюсь, что вы получите граф объектов до тех пор, пока листовой узел не будет сериализован правильно, если 'JSON.use ('deep')' не используется. Опять же, заходите в образцы по строкам.:) – dmahapatro