Это допустимое использование переходных процессов Grails? - PullRequest
4 голосов
/ 27 января 2010

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

class Contact {

    def Seeker

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

    Date initiatedDate
    Date acceptedDate

    static transients = ['pal']
    Seeker pal
}

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

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

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

Кажется, что все работает нормально, за исключением того, что в возвращаемом JSON отсутствует объект pal.

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

Спасибо

1 Ответ

7 голосов
/ 27 января 2010

Переходные процессы действительно используются для предотвращения сохранения полей в объектах домена. (Если вы хотите выполнить некоторую инициализацию в поле pal, не помещая его в свой контроллер, вы можете использовать событие onLoad () или написать метод getPal (), который переопределит свойство get по умолчанию). Вы также можете заметить, что маршаллер 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) {
            ...
        }

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

НТН

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

...