我有一项服务可以在会话中获取和设置用户。如果有登录用户,我想将一些用户信息传递给每个视图,并认为过滤器是最好的方法,这样我就不必在每个控制器/操作中重复该信息。当我运行该应用程序时,出现以下错误:
Error creating bean with name 'userService': Scope 'session' is not active for the current thread
我的过滤器看起来像这样:
class SecurityFilters {
def userService
def filters = {
setUser(controller:'*', action:'*') {
before = {
if (userService.isLoggedIn()) {
request.user = userService.getUser()
} else {
request.user = null
}
}
}
}
}
我知道我最终可以通过 session.user 访问用户,但我希望能够调用 userService.isLoggedIn() ,但我无法轻松地通过视图调用 userService.isLoggedIn() 。那么有没有办法将服务注入到过滤器中,或者我应该创建一个标签库来包装 userService.isLoggedIn() ?
看起来问题是您的 userService 的范围仅限于会话,并且在尝试将服务注入过滤器时不一定存在会话。
如果您的 userService 必须是会话范围的,那么您需要在 spring 配置中使用范围代理。例如。在 grails-app/conf/spring/resources.groovy 中:
import com.your.service.UserService
...
userServiceSession(UserService)
{ bean ->
bean.scope = 'session'
}
userServiceSessionProxy(org.springframework.aop.scope.ScopedProxyFactoryBean)
{
targetBeanName = 'userServiceSession'
proxyTargetClass = true
}
然后在 SecurityFilter 中重命名注入的变量:
def userServiceSessionProxy
(显然,要重命名您在课堂上其他地方使用它的地方)。
这应该做的是在注入时注入代理,但仅在执行过滤器时(当有会话时)转到实际服务。
注意:不确定这样做是否仍然会让其他有会话的地方(例如控制器)仍然将服务引用为“userService”,如果不是,您可能可以在 resources.groovy 中将 userServiceSession 重命名为 userService (并相应地更新 targetBeanName )。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)