Grails заполняет модель контроллера из bootstrap.groovy без поддержки базы данных

Я понимаю, что стандартный способ использования bootstrap.groovy и контроллера состоит в том, чтобы создать данные и сохранить их в БД в начальной загрузке init(). Затем контроллер может прочитать данные, поэтому «посредник» между ними — это база данных. .

Но что, если я хочу создать данные в bootstrap.groovy, а не сохранять их в базе данных (допустим, эти данные не нужно сохранять), как я могу ввести данные в контроллер, чтобы их можно было использовать для представлений рендеринг?

Возьмем простой пример с доменным классом Book. Просто в начальной загрузке я просто хочу создать фиктивный список из 100 книг:

class BootStrap {

    def grailsApplication

    def List<Book> books

    def init = { servletContext ->
        books = new ArrayList<>()

        for (int i=0; i<100; i++) {
            books.add(new Book(numPages: 20))
        }

    }

    def destroy = {
    }
}

Теперь цель состоит в том, чтобы предоставить/вставить список книг в BookController. Как бы я это сделал? Я не мог найти простой способ или ответ нигде по этому поводу


person Diego Sch    schedule 21.04.2017    source источник


Ответы (2)


Службы в Grails по умолчанию являются одноэлементными, поэтому вы можете хранить эти данные в службе. Но вы должны быть осторожны, потому что услуга может использоваться одновременно.

https://docs.grails.org/latest/guide/services.html

person quindimildev    schedule 21.04.2017
comment
Это звучит как возможное решение, но тогда я бы предположил, что экземпляр службы доступен (уже инициализирован) в контроллере, а не в bootstrap.groovy. Это может быть нормально, если вам нужно вызвать облегченный метод в службе, но если мне нужно вызвать метод в службе, который выполняет операцию ввода-вывода (в данном случае чтение json-файла), я бы подумал о таком месте, как bootstrap. groovy — лучшее место для этого (во время загрузки приложения), и как только данные будут кэшированы, службы и контроллеры могут начать их использовать. - person Diego Sch; 21.04.2017
comment
Есть много правильных подходов к решению вашей проблемы и, конечно же, они будут зависеть от вас. Вам решать, как это сделать, по крайней мере, для меня все правильно. Вы также можете проверить на сервисе, были ли данные загружены (по запросу), а если нет, загрузите данные и сохраните их в памяти. - person quindimildev; 24.04.2017

Чтобы обобщить проблему, которую я опубликовал выше (после прочтения ответа от quindimildev), обычно каждая структура должна иметь способ выполнения операций инициализации... таких как инициализация кеша из файла или базы данных или сторонних сервисов. К моменту запуска приложения эти данные находятся в памяти и готовы к использованию контроллерами и т. д.

Типичные приложения/примеры, которые я видел для Grails, не принимают во внимание это, и они предполагают, что ваша база данных заполнена и считывается через действия контроллеров. Это нормально для большинства приложений, но я был бы удивлен, если бы в Grails не было механизма для создания кэша при запуске (однократная операция, которая может занять несколько секунд), который может быть доступен для всех контроллеров после запуска приложения. .

Я надеюсь, что это проясняет сценарий, который я пытаюсь решить

person Diego Sch    schedule 21.04.2017