Grails会话Scoped bean数据状态未正确更新

时间:2014-07-16 18:50:25

标签: session grails

我有一个Grails Web应用程序,我需要在每个用户会话中保留一些数据。我不想使用HTTP Session,而是创建一个会话范围的bean。下面给出的是我的Session Scoped bean定义 -

class SessionContainer implements Serializable {

    static scope = 'session' (if I am using resources.groovy)

    Boolean abc
    Boolean def
    Boolean xyz
    SomeOtherChildBean someBean
}

这就是我的控制器的样子:

class MyController {

    def myService

    def showMyProblem() {
      myService.updateSession()
      myService.printSessionData()
    }
}

这就是我的服务类的样子:

class MyService {

    SessionContainer sessionContainer

    def updateSession() {
      sessionContainer.abc = true
      sessionContainer.def = true
      sessionContainer.xyz = true
    }

    def printSessionData() {
        def abc = sessionContainer.abc
        def def = sessionContainer.def
        def xyz = sessionContainer.xyz
        println abc // This is always false (which is incorrect)
        println def // This is true (which is correct)
        println xyz // This is true (which is correct)
    }
}

我使用2种方式注入会话bean - 在resources.groovy -

sessionContainerBean(SessionContainer) { bean ->
    bean.scope = 'session'
}
sessionContainer(org.springframework.aop.scope.ScopedProxyFactoryBean) {
    targetBeanName = 'sessionContainerBean'
    proxyTargetClass = true
}

在resources.xml中的OR

<bean id="sessionContainer" name="sessionContainer" class="com.dataobjects.SessionContainer" scope="session">
    <aop:scoped-proxy/>
</bean>

我尝试了两种不同的方法来注入会话范围的bean来解决我的问题,尽管abobe提到的方式导致了同一个Session Scoped bean。

从我的代码中可以看出,我正在从Session scoped bean中打印布尔变量,而 abc 值始终为false(这是不正确的)。打印其他布尔变量时,它会呈现正确的值。

我很惊讶会话bean如何为少数变量提供正确的状态,但没有更新某些变量的状态。

我甚至尝试使用Session Scoped服务(静态范围='true'),但得到了以下错误 - 我最终创建了一个代理范围的服务,如此处所述Grails session-scoped service - not working,但与Session Scoped相同的行为豆。

Error creating bean with name 'myService': Scope 'session' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread

1 个答案:

答案 0 :(得分:3)

如果MyServicegrails-app/services/下定义的真实Grails服务,那么您无需在resources.groovyresources.xml中定义bean。您可以将范围表示为静态属性:

// grails-app/services/demo/MyService.groovy
package demo

class MyService {
    static scope = 'session'

    // ...
}

这有帮助吗?