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 プラグインがなくてもうまく機能しますが、2 つが一緒に機能するようには見えません :(

以下のコード スニペットが問題のようです。

ここで2つの問題が発生する可能性があると思います

1) 最初に実行は
all(controller:' ', action:' ')に到達します

アプリケーションの起動時に 1 回だけ。新しいリクエストがあり、したがって新しいセッションがあるたびに、そこに到達する必要があると考えています。

2) 何らかの修正を加えて何とかそこまでたどり着いたとしても、すべてを通り抜けることはできないと思います(controller:' ', action:' ')

作曲家は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 フィルター プラグインに何らかの変更を加えて、2 つが単一のアプリケーションで共存できるようにするとより良いでしょう :)

ありがとう

于 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 に答える