2010-09-29 74 views
8

我有一個服務來獲取和設置用戶在會話中。我想將一些用戶信息傳遞給每個視圖,如果有一個登錄用戶,並認爲過濾器將是最好的方式,所以我不必在每個控制器/操作中複製它。當我運行的應用程序,它得到這個錯誤:我可以將服務注入Grails中的過濾器嗎?

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(),我不能輕易通過視圖。那麼有沒有辦法將服務注入過濾器,或者我應該創建一個taglib來包裝userService.isLoggedIn()?

+0

那麼,答案是否定的,我不能。我添加了一條評論,顯然被刪除,說我不能,並提供了一種不同的方法。 – varikin 2014-03-20 20:23:23

回答

9

看起來問題在於你的userService被限制在會話中,並且在嘗試將服務注入到過濾器時不一定會有會話發生。

如果您的userService必須是會話作用域,那麼您需要在您的spring配置中使用作用域代理。例如。 Grails中,應用程序/ conf目錄/春/ 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',如果不是的話,您可能能夠在resource.groovy中將userServiceSession重命名爲userService (並相應地更新targetBeanName)。

+0

這聽起來像是一個有效的解決方案,但我選擇切換到taglib。看似簡單。 – varikin 2010-10-01 19:55:57

0
import org.codehaus.groovy.grails.web.context.ServletContextHolder 
import org.springframework.context.ApplicationContext 
import org.springframework.web.context.support.WebApplicationContextUtils 
class SecurityFilters { 
    def userService 

    def filters = { 
     setUser(controller:'*', action:'*') { 
      before = { 
       def servletCtx = ServletContextHolder.getServletContext() 
       ApplicationContext applicationContext = WebApplicationContextUtils. 
        getRequiredWebApplicationContext(servletCtx) 
       userService =applicationContext.getBean('userService') 
       if (userService.isLoggedIn()) { 
        request.user = userService.getUser() 
       } else { 
        request.user = null 
       } 
      } 
     } 
    } 
} 
相關問題