Является ли это допустимым использованием переходных процессов Grails?

StackOverflow https://stackoverflow.com/questions/2148413

  •  23-09-2019
  •  | 
  •  

Вопрос

У меня есть доменный объект, на котором я хочу сохранить несколько вещей, которые существуют только во время выполнения.Я посмотрел на Документация и обнаружил, что 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

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

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

Спасибо

Это было полезно?

Решение

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

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

HTH

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top