启用grails休眠过滤器

问题描述

| 嗨,我正在使用Grails过滤器插件 我正在尝试如下定义认过滤器
// Defined inside the Book entity
static hibernateFilters = {
    activeFilter(condition:\'active=1\',default:true)
}
当我运行集成测试时,过滤器不适用于动态查找器方法,例如
Book.findAll()
如果我在BootStrap.groovy类中添加以下行
Book.enableHibernateFilter(\'activeFilter\')
然后应用过滤器。 但是,在运行应用程序时,无论是否在BootStrap.groovy中使用以上代码,都不会应用过滤器 有任何想法吗 ? 经过一番挖掘之后,我发现了 休眠过滤器插件在没有zkgrails插件的情况下可以很好地工作,但是两者似乎不能一起工作:( 下面的代码片段似乎是我的问题。 我认为我们这里可能有两个问题 1)最初执行到     全部(控制器:\'\',操作:\'\') 在应用程序启动期间仅一次。我认为每次有新的请求并因此有新的会话时,它应该到达那里。 2)即使经过某种修改后以某种方式到达那里,我也不认为它会过去     全部(控制器:\'\',操作:\'\') 作曲家在zkoss中使用
class HibernateFilterFilters {

    def filters = {
        all(controller:\'*\',action:\'*\') {
            before = {
                def session = grailsApplication.mainContext.sessionFactory.currentSession
                DefaultHibernateFiltersHolder.defaultFilters.each {name ->
                    session.enableFilter(name)
                }
            }
            after = {

            }
            afterView = {

            }
        }
    }

}
    

解决方法

经过一番挖掘后,我想出了解决上述问题的方法 我基本上扩展了GrailsOpenSessionInViewFilter类
public class OpenSessionInViewFilterExt extends GrailsOpenSessionInViewFilter{
@Override
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
    Session session = super.getSession(sessionFactory);
    for (Object filterName : DefaultHibernateFiltersHolder.getDefaultFilters()) {
        session.enableFilter((String) filterName);
    }
    return session;
}
} 我在web.xml中也有一个条目
    <filter>
        <filter-name>OpenSessionInViewFilterExt</filter-name>
        <filter-class>com.nthdimenzion.hibernate.ext.OpenSessionInViewFilterExt</filter-class>
</filter>


<filter-mapping>
    <filter-name>OpenSessionInViewFilterExt</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
现在,每次创建新会话时,都会为其启用默认过滤器。我认为这应该可以,但是如果可以对zkgrails插件或休眠过滤器插件进行一些更改,使二者可以在一个应用程序中共存,那就更好了:) 谢谢     ,在我的Grails 2.5.X应用程序中,我启用了Web过滤器中的休眠过滤器,即在ѭ6中有此代码
    class Filters {
        publishedContentFilter(uri: \'/**\'){
            before = {
                // enable the \'published filter in the Condition domain class
                Condition.enableHibernateFilter(\'published\')
            }
        }
    }
在插件本身的集成测试中,在测试类的设置方法中启用了过滤器。