2010-01-27 13 views
4

У меня есть объект домена, на котором я хочу хранить несколько вещей, которые существуют только во время выполнения. Я посмотрел на documentation и нашел ключевое слово transients, которое, на первый взгляд, было тем, что я искал. Вот что мой объект домена выглядит ...Является ли это допустимым использованием переходных процессов Grails?

class Contact { 

    def Seeker 

    def beforeInsert() 
    { 
     initiatedDate = new Date() 
    } 

    Date initiatedDate 
    Date acceptedDate 

    static transients = ['pal'] 
    Seeker pal 
} 

где Seeker является заводной класс, который не является объектом домена, но заполнитель для некоторых свойств.

До сих пор все в порядке, и моя таблица контактов не имеет поля pal, как и ожидалось. В моем ContactController я запрашиваю связку контактов, c, а затем просматриваю их Seeker pals (подробности о том, как они удержаны) и задайте поле pal новому объекту.

c.pal = new Seeker(); 
c.pal.name = otherObject.name 
render c as JSON 

Это все работает отлично, за исключением того, что у JSON нет возвращенного объекта.

Является ли это допустимым использованием переходных процессов? В документах упоминается, что они удобны для функций getter и seters, основанных на функциях, но в моем случае я хочу фактический объект. Должен ли я писать метод getPal() и setPal() для моего объекта?

Благодаря

ответ

7

транзиентов действительно используется для остановки поля объектов домена от сохранялось. (Если вы хотите выполнить некоторую инициализацию в поле «Прил», не помещая ее в свой контроллер, вы можете использовать событие onLoad() или написать метод getPal(), который переопределяет свойство getter по умолчанию). Вы также правы отметить, что маршаллер JSON по умолчанию только отображает сохраняемые поля.

При рендеринге объектов моего домена я нашел полезным создавать маршаллеры объектов JSON, чтобы нежелательные свойства не отображались, но это также решило бы вашу временную проблему. Вы можете сделать это с помощью метода JSON.registerObjectMarshaller:

import grails.converters.JSON 
... 
class BootStrap { 

    def init = {servletContext -> 
     JSON.registerObjectMarshaller(Contact) { 
      def returnArray = [:] 
      returnArray['id'] = it.id 
      returnArray['initiatedDate'] = it.initiatedDate 
      returnArray['acceptedDate'] = it.acceptedDate 
      returnArray['pal'] = it.pal 
      return returnArray 
     } 

     JSON.registerObjectMarshaller(Seeker) { 
      ... 
     } 

Если добавить marshallers в вашем BootStrap.groovy они будут доступны в контроллерах.

НТН

(Также найдено это: http://old.nabble.com/Taggable-plugin-and-JSON-converter-ts24830987.html#a24832970)

+0

вкусно, спасибо! Я постараюсь в – Simon

+0

как вопрос интереса, как бы поставить это в bootstrap.groovy? Должен ли я включать JSON-сортировку из grails.converters? – Simon

+0

Поместите его внутри закрытия инициализации и импортируйте grails.converters.JSON (я обновил пример в сообщении, чтобы показать это) –