问题描述
|
嗨,我正在使用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\')
}
}
}
在插件本身的集成测试中,在测试类的设置方法中启用了过滤器。