Как использовать библиотеку с собственным фильтром и неконтроллерным сервлетом в приложении 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. - В этой теме кто-то хотел поставить фильтр после ответа, не основанного на контроллере. В моем случае проблема заключается в активации самого фильтра, а не в том, какой запрос / ответ он защищает.
- В этой теме у кого-то еще были проблемы с загрузкой Grails для загрузки Togglz. Они видели не найденные ошибки при запуске, где я этого не делаю, и их интересовало фактическое применение togglz, а не консольного сервлета. Кроме того, ответом в этом случае было удалить
Попытка записи 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
из String
s.
Во-вторых, установка фильтра сервлетов из вашей библиотеки. Теперь это можно сделать любым количеством способов, от написания плагина для вас или установки его вручную (о чем я расскажу здесь).
Чтобы начать установку фильтра сервлетов, вам сначала нужно использовать команду 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, так и фильтр сервлетов, предоставляемый вашей библиотекой.
Удачи и счастливых праздников!