Как использовать библиотеку с собственным фильтром и неконтроллерным сервлетом в приложении Grails?

Я думаю, что краткая, общая форма моего вопроса может быть наилучшей: как заставить Grails/Spring "видеть" компоненты библиотеки зависимостей, включая фильтры и сервлеты, которые не являются контроллерами Grails?

Вот особенности: я хотел бы использовать библиотеку переключения функций Togglz (v2.0.1) в моем приложении Grails (v2.4.4). Togglz поставляется с собственным сервлетом веб-консоли и классом TogglzFilter, который выполняет некоторую инициализацию при запуске и устанавливает состояние для каждого запроса. В веб-приложении vanilla spring оба они обычно связаны аннотациями, поэтому путь к URL [context-root]/togglz/index вызывает консоль. (Сервер Pivotal tc / tomcat 7, который, как мне кажется, удовлетворяет требованию Servlet 3.0 для работы конфигурации, управляемой аннотациями.) У меня вопрос: как мне подключить такую ​​штуку к моему приложению Grails?

Я новичок и в Grails, и в Togglz, так что, возможно, мне не хватает чего-то глупого. Все, что я пробовал, выдает 404 по URL консоли. Пока что у меня есть:

  • Добавлены зависимости ядра, сервлета, консоли и пружины togglz в BuildConfig.groovy.
  • Добавил org.togglz и пакет, в который я поместил свой конфиг Togglz (следующие два элемента) в значение grails.spring.bean.packages в Config.groovy.
  • Созданы классы FeatureTogglz и FeatureTogglzConfig, оба аннотированы @Component.

Казалось, что это должно сработать, но когда этого не произошло, я попробовал еще несколько вещей:

  • Поиск различных комбинаций Grails, Togglz, Library, Servlet, Filter и т. Д. Привел к двум ошибкам:
    • В этой теме у кого-то еще были проблемы с загрузкой Grails для загрузки Togglz. Они видели не найденные ошибки при запуске, где я этого не делаю, и их интересовало фактическое применение togglz, а не консольного сервлета. Кроме того, ответом в этом случае было удалить metadata-complete атрибут из web.xml. В моем проекте вообще нет web.xml.
    • В этой теме кто-то хотел поставить фильтр после ответа, не основанного на контроллере. В моем случае проблема заключается в активации самого фильтра, а не в том, какой запрос / ответ он защищает.
  • Попытка записи UrlMappings.groovy с использованием класса сервлета консоли в качестве цели:

    "/togglz/index"(org.togglz.console.TogglzConsoleServlet)`.
    

    Я не вижу подобных примеров; Я просто пытался угадать, что может достичь того, что могло бы быть в web.xml.

  • Подумав, может быть, проблема в том, что Grails не настраивал фильтр Togglz, который выполняет некоторую инициализацию при запуске в дополнение к настройке контекста для каждого запроса, я создал conf/TogglzFilters.groovy, опять же догадываясь о содержимом:

    import org.togglz.servlet.TogglzFilter
    
    public class TogglzFilters {
        def filters = {
            togglzFilter(controller:'*', action:'*') {
                before = {
                    new TogglzFilter().doFilter(request, response, null)
                }
            }
        }
    }
    

    Даже до того, как он стал нулевым, это казалось совершенно неправильным, потому что я хочу, чтобы Grails использовал предоставленный фильтр, а не сам его кодировал. Но все примеры фильтров, которые я мог найти, использовали встроенный код.

Как я уже сказал, многое из этого является для меня новым, поэтому, если я просто что-то упустил из-за того, что я должен был изучить, я был бы так же благодарен за указатель, как и за прямой ответ.

Благодарю.

2 ответа

Если бы я правильно понял вопрос, часть ответа Джошуа о перечислении пакетов с бобами была бы правильной. Его рекомендация установить шаблоны и отредактировать полученный файл web.xml также оказалась важной, но не указывать фильтр вручную.

Спасибо, Джошуа. Как оказалось, мои подозрения в отношении моего собственного невежества были вполне обоснованными. Togglz не использует аннотации вообще. Он использует файлы web-фрагмента. XML для определения консольного сервлета и фильтра запросов. Проблема оказалась в том, что мы уже выполнили установку-шаблоны, и сгенерированный Grails web.xml включил metadata-complete="true", который подавлял как аннотацию, так и сканирование фрагментов сети. Редактирование файла для удаления этого атрибута (по умолчанию "false") было ключевым.

Таким образом, есть два аспекта вашего вопроса, которые необходимо решить.

Во-первых, конфигурация Spring основана на аннотациях.

Весенние аннотации изнутри org.springframework.context.annotation пакет, такой как @Configuration или даже просто @Bean Grails не идентифицирует вас, если вы не укажете, какие пакеты сканировать. Это делается изнутри вашего Config.groovy со следующей строкой:

// Config.groovy
grails.spring.bean.packages = ['the.package.name.goes.here']

В приведенном выше примере мои компоненты Spring находятся в пакете the.package.name.goes.here поэтому вам необходимо обновить его с помощью пакетов для ваших компонентов. Вы можете указать несколько пакетов, так как настройка List из Strings.

Во-вторых, установка фильтра сервлетов из вашей библиотеки. Теперь это можно сделать любым количеством способов, от написания плагина для вас или установки его вручную (о чем я расскажу здесь).

Чтобы начать установку фильтра сервлетов, вам сначала нужно использовать команду install templates, чтобы скопировать шаблоны, используемые Grails при генерации кода, в ваш проект. Эти шаблоны появятся под src/templates, В этом случае нам нужно изменить src/templates/war/web.xml включить фильтр сервлетов.

Обычно установка фильтра выглядит примерно так:

<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

Точные требования и настройки для вашего фильтра сервлетов могут немного отличаться, и я рекомендую вам обратиться к документации для вашей библиотеки для них.

С двумя вышеупомянутыми изменениями в вашем приложении Grails вы сможете использовать как конфигурацию на основе аннотаций Spring, так и фильтр сервлетов, предоставляемый вашей библиотекой.

Удачи и счастливых праздников!

Другие вопросы по тегам