启用grails hibernate过滤器

时间:2011-05-24 16:10:17

标签: hibernate grails filter zk

您好我正在使用Grails filter plugin

我正在尝试定义默认过滤器,如下所示

// Defined inside the Book entity
static hibernateFilters = {
    activeFilter(condition:'active=1', default:true)
}

当我运行集成测试时,过滤器不适用于

等动态查找器方法
Book.findAll()

如果我在BootStrap.groovy类中添加以下行

Book.enableHibernateFilter('activeFilter')

然后应用过滤器。

但是,当运行应用程序时,永远不会应用过滤器,无论是否有BootStrap.groovy中的上述代码

有什么想法吗?

经过一番挖掘后,我发现了

hibernate过滤器插件在没有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 = {

            }
        }
    }

}

2 个答案:

答案 0 :(得分:1)

经过一番挖掘后,我找到了上述问题的解决方法

我基本上扩展了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插件或hibernate过滤器插件中进行一些更改以便两者可以在单个应用程序中共存,那将会更好:)

由于

答案 1 :(得分:-1)

在我的Grails 2.5.X应用程序中,我在网络过滤器中启用了休眠过滤器,即我在grails-app/conf/Filters.groovy

中有此代码
    class Filters {
        publishedContentFilter(uri: '/**'){
            before = {
                // enable the 'published filter in the Condition domain class
                Condition.enableHibernateFilter('published')
            }
        }
    }

在插件本身的集成测试中,测试类的filters are enabled in the setup method