включение фильтров гибернации Grails - PullRequest
2 голосов
/ 24 мая 2011

Привет! Я использую плагин фильтра 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 = {

            }
        }
    }

}

Ответы [ 2 ]

1 голос
/ 26 мая 2011

После небольшого копания я нашел способ решения вышеуказанной проблемы

Я в основном расширяю класс 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 или плагине фильтров гибернации, чтобы они могли сосуществовать в одном приложении:)

Спасибо

0 голосов
/ 26 октября 2016

В моем приложении 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')
            }
        }
    }

В интеграционных тестах в самом плагине, фильтры включены в методе настройки тестового класса.

...