Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate过滤器插件在Grails中不起作用_Hibernate_Grails_Plugins_Filter_Multi Tenant - Fatal编程技术网

Hibernate过滤器插件在Grails中不起作用

Hibernate过滤器插件在Grails中不起作用,hibernate,grails,plugins,filter,multi-tenant,Hibernate,Grails,Plugins,Filter,Multi Tenant,我正在使用Hibernate筛选器在继承业务域的每个域中启用分支id…我在每个域中都包括Hibernate筛选器,例如 static hibernateFilters = { branchEnabledFilter(condition: ':branch_id=branch_id', types: 'long', default: true) } 通过我们的Grails过滤器启用此hibernate过滤器…如下所示 def filters = { all(con

我正在使用Hibernate筛选器在继承业务域的每个域中启用分支id…我在每个域中都包括Hibernate筛选器,例如

static hibernateFilters = {
        branchEnabledFilter(condition: ':branch_id=branch_id', types: 'long', default: true)
}
通过我们的Grails过滤器启用此hibernate过滤器…如下所示

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…但我的筛选器正在工作…但它没有为此请求启用hibernate筛选器…但如果我修改了筛选器中的任何代码,如comment println或uncomment println,那次编译过滤器…然后一切正常。。。请告诉我这里发生了什么。。。如何解决这个问题…如何在所有请求中工作..

很难说清楚,但我也在做类似的事情,这就是我能说出来的区别:

我认为每个域筛选器需要有不同的名称,例如: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过滤器,在您的例子中,onlyAuthcontroller:'login',action:'auth',它通过每个过滤器循环并禁用它,但我不确定是否需要它

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

我在这里发现有趣的是,您截获了login/auth,它通常只显示登录页面并请求主体的分支id。在大多数情况下,这些信息不会被知道,因为用户正要登录。我可能会在登录成功后应用过滤器。顺便说一句,过滤器是会话感知的,或者首先登录的人为所有其他人设置过滤器?首先。谢谢你的回复。在登录控制器中,身份验证操作给出登录页面…除了该操作之外,在每个控制器的操作中…我请求分支id…反转为true将完成该工作…我想这个问题解决了吗?我也面临同样的问题。谢谢你的回答…在所有域中更改了筛选器名称…仍然没有设置分支id。。。