我有一个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
答案 0 :(得分:3)
如果MyService
是grails-app/services/
下定义的真实Grails服务,那么您无需在resources.groovy
或resources.xml
中定义bean。您可以将范围表示为静态属性:
// grails-app/services/demo/MyService.groovy
package demo
class MyService {
static scope = 'session'
// ...
}
这有帮助吗?