2015-06-05 41 views
0

工作我使用Hibernate的過濾器,以使每一個它繼承業務領域的分支ID ....我列入休眠過濾器像Hibernate的過濾器插件不是Grails的

static hibernateFilters = { 
     branchEnabledFilter(condition: ':branch_id=branch_id', types: 'long', default: true) 
} 

啓用該休眠過濾器通過我們的Grails的過濾器......像下面..

def filters = { 
     all(controller:'login', action:'auth',invert:true) { 
      before = { 
       grailsApplication.getArtefacts("Domain")*.clazz.each{ clazz -> 
        if(clazz.getGenericSuperclass().getName().contains('BusinessDomain')){ 
         def filter = clazz.enableHibernateFilter('branchEnabledFilter') 
         filter.setParameter('branch_id',applicationContext.springSecurityService.principal?.branchId as long) 
        } 
       } 
      } 
      after = { 
       // 
      } 
     } 
} 

當用戶登錄第一次,我打電話給家庭控制器,然後在儀表板頁面,通過鏈接調用通知控制器......我第一次錯誤,如分支ID沒有設置...但我的過濾器工作...但它確實nt啓用這個請求的Hibernate過濾器...但是,如果我修改過濾器中的任何代碼,如評論println或取消註釋println,那時候編譯過濾器......然後一切工作正常......請告訴我這裏發生了什麼......如何解決這個問題...如何讓工作在所有的請求..

+0

我覺得這裏有趣的是,你攔截login/auth,通常只顯示登錄頁面和請求委託人的分支id。在大多數情況下,這些信息不會被認爲是用戶正要登錄。我可能會掛鉤登錄成功,然後應用過濾器。順便說一下,過濾器是會話感知或登錄的人首先設置爲所有其他人? – defectus

+0

首先。謝謝您的回覆。在登錄控制器,身份驗證操作給登錄頁面...除了這一行動,在每一個控制器的行動...我要求分行ID ...反轉真正會做那個工作...我認爲 – Visme

+0

這個問題解決了嗎?我面臨同樣的問題。 – Balkrishna

回答

0

很難說準確,但我在做類似的東西,這就是區別我可以告訴大家:

我認爲你需要有domainAFilter,domainBFilter

在grails濾波器我用(短版):爲每個域濾波器,即,不同的名稱

import org.grails.plugin.hibernate.filter.DefaultHibernateFiltersHolder; 

def hibernateSession = grailsApplication.mainContext.sessionFactory.currentSession 
DefaultHibernateFiltersHolder.defaultFilters.each { name -> 
    def aFilter = hibernateSession.enableFilter(name) 
    aFilter.setParameter('branchId', springSecurityService.principal.branchId) 
} 

我也有一個「對立」 Grails的過濾器,你的情況onlyAuth(控制器:「登錄」,動作:「權威性」),通過每個過濾器循環,並禁用它,但我不知道如果需要的話。

def hibernateSession = grailsApplication.mainContext.sessionFactory.currentSession 
DefaultHibernateFiltersHolder.defaultFilters.each { name -> 
    hibernateSession.disableFilter(name) 
} 
+0

謝謝您的回答...更改了所有域中的過濾器名稱...尚未設置分支ID ... – Visme

相關問題