2

嗨,我正在使用Grails 过滤器插件

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

// 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 = {

            }
        }
    }

}
4

2 回答 2

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 过滤器插件中进行一些更改,以便两者可以在一个应用程序中共存,那就更好了:)

谢谢

于 2011-05-26T18:35:13.700 回答
-1

在我的 Grails 2.5.X 应用程序中,我在 web 过滤器中启用了休眠过滤器,即我有这个代码grails-app/conf/Filters.groovy

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

在插件本身的集成测试中,过滤器在测试类的 setup 方法中启用。

于 2016-10-26T00:11:16.523 回答