Объем сеанса 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")
и ожидайте, что ваш код будет работать. Надеюсь это поможет.