Объем сеанса Grails для службы не работает должным образом

Я делаю веб-приложение, которое хранит отчеты различных типов в качестве объектов домена, поэтому у меня есть объект домена HeadOfHousehold который содержит данные имени и ссылки на другие объекты домена, такие как reports, addressesи любые иждивенцы. Я пытаюсь создать список недавно просмотренных / созданных HeadOfHousehold объекты. После нескольких поисков в Google и изучения руководства, оказалось, что сервис будет подходящим решением. Итак, я создал ClientListService:

@Transactional
class ClientListService {
    static scope = "session"
    String message // right now I'll be happy to just see the same message across 
                  // pages I can add a list and manipulate it later.
}

Я думал, что смогу ссылаться на него в моих различных контроллерах, и он будет сохраняться примерно так:

def clientListService

def index(){
    hasSearched = false
    clientListService = new ClientListService(message: "Hello")
    [errorMessage: params.errorMessage, clients:clientListService]

}

Который должен быть доступен в более позднем контроллере:

class HeadOfHouseHoldController {
     def clientListService
    def index() {

        [customer: HeadOfHousehold.get(params.id), clients: clientListService]
    }//...

Однако, когда я пытаюсь получить сообщение, оно выглядит так, как если бы объект был нулевым. Из моего index.gsp:

***************${clients?.message}********************

Поэтому я не знаю, правильно ли я определяю сессию (я не делаю для этого ничего особенного), не понимаю ли, как работает сессия, или что-то еще. Я вижу правильное сообщение на исходной странице, которое определило объект, однако я не вижу его ни на каких последующих страницах.

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

1 ответ

Решение

Я думаю, что вы поняли session сфера правильно. Каждый bean-компонент Spring с областью действия сеанса связан с сеансом HTTP.

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

class FooController {
   def clientListService // gets autowired by Grails/Spring

   def index(){
       hasSearched = false
       clientListService.message = 'Hello' // only assign a String value to the service
       [errorMessage: params.errorMessage, clients:clientListService]
   }
}

Это означает, что вы не можете не делать что-то вроде

clientListService = new ClientListService(message: "Hello")

и ожидайте, что ваш код будет работать. Надеюсь это поможет.

Другие вопросы по тегам