grailsgrails-services

Grails Session scope for service not working as expected


I'm making a web app that stores reports of various types as domain objects, so I have a domain object HeadOfHousehold which contains name data, and references to other domain objects such as the reports, addresses, and any dependants. I am trying to build a list of recently viewed/created HeadOfHousehold objects. After multiple Google searches, and scouring the manual, it appeared that a service would be an appropriate solution. So I created 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.
}

I thought I could then reference it in my various controllers, and it would persist Something like this:

def clientListService

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

}

Which should be available in a later controller:

class HeadOfHouseHoldController {
     def clientListService
    def index() {

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

However when I try to get the message, it appears as if the object is null. From my index.gsp:

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

So I don't know if I am not defining session properly (I'm not doing anything special to do so), if I'm misunderstanding how the session scope works, or something else. I do see the proper message on the original page which has defined the object, however I don't see it on any subsequent pages.

Also, I'm not sure if this is the proper way to go about this; right now all I really need is the list of HeadOfHouseholds that I would need (so I can add to the list from other pages), however I can see possibly adding other logic and items into such a class.


Solution

  • I think you understood the session scope correctly. Each Spring bean with a session scope is bound to the HTTP session.

    But your first controller listing does it all wrong. You are not supposed to instantiate the service class yourself. This is what Spring (Grails) does.

    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]
       }
    }
    

    This means you cannot not do something like

    clientListService = new ClientListService(message: "Hello")
    

    and expect your code to work. Hope this helps.