0

我正在制作一个将各种类型的报告存储为域对象的 Web 应用程序,因此我有一个域对象HeadOfHousehold,其中包含名称数据,以及对其他域对象(例如reportsaddresses和任何依赖项)的引用。我正在尝试构建最近查看/创建的HeadOfHousehold对象的列表。在多次谷歌搜索和搜索手册之后,服务似乎是一个合适的解决方案。所以我创建了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(所以我可以从其他页面添加到列表中),但是我可以看到可能将其他逻辑和项目添加到这样的类中。

4

1 回答 1

2

我认为您session正确理解了范围。每个具有会话范围的 Spring bean都绑定到 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")

并期望您的代码能够正常工作。希望这可以帮助。

于 2014-06-12T06:23:39.607 回答