Сервлеты и фильтры зарегистрированы как Spring Beans вместо web.xml в Grails
В документе Grails "Обновление с 2.x до 3.0.6" было отмечено, что "новые сервлеты и фильтры могут быть зарегистрированы как Spring bean-компоненты или с ServletRegistrationBean и FilterRegistrationBean соответственно", однако об этом больше ничего не сказано.
Мне интересно, есть ли у кого-нибудь хорошие сведения о том, как это сделать правильно (например, с помощью init/BootStrap.groovy, который содержит контекст сервлета для загрузки bean-компонентов, а не bean-компонентов в conf/spring) или, возможно, есть какой-то предопределенный Spring способ сделать это, что очевидно, и я скучаю.
Примечание: я пытаюсь интегрировать spring-w в Grails 3.0.6.
1 ответ
Вы должны сделать это в doWithSpring
для плагина, или grails-app/conf/spring/resources.groovy
для приложения. Поскольку Grails 3 основан на Spring Boot, вы также можете использовать @Bean
метод.
Когда запускается контекст приложения, Spring ищет ServletRegistrationBean
s, FilterRegistrationBean
s и т. д. и использует их настроенные свойства для программной регистрации в контейнере сервлетов.
Есть несколько примеров в источнике Grails. ControllersGrailsPlugin регистрирует некоторые фильтры (например, здесь) и здесь регистрируется основной сервлет диспетчера.
В документации Spring Boot есть некоторая документация, хотя она смещена в сторону @Bean
методы, но вы можете использовать любой подход к определению bean-компонентов.
(Работает для Grails 3 (в частности, версия 3.3.3))
Чтобы добавить пользовательский прослушиватель в servletContext с помощью раздела "doWithSpring" файла дескриптора плагина (*GrailsPlugin.groovy):
Шаг 1
* GrailsPlugin.groovy
...
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean
import my.custom.listeners.ContextListener
...
class MyAppGrailsPlugin extends Plugin {
...
Closure doWithSpring() {
{->
...
httpSessionServletListener(ServletListenerRegistrationBean){
listener = bean(ContextListener)
}
...
}
...
}
Шаг № 2: Теперь его можно назвать, например, в классах обслуживания как:
SomeService.groovy
class SomeService{
...
def httpSessionServletListener
...
def someMethod(){
httpSessionServletListener.getSessions()
}
...
}
Шаг № 0: Должен быть написан пользовательский класс фильтра
Вот фрагмент пользовательского класса слушателя, реализующего соответствующий интерфейс:
ContextListener.groovy
import javax.servlet.http.HttpSession
import javax.servlet.http.HttpSessionListener
public class ContextListener implements HttpSessionListener {
...
/**
* All current sessions.
*/
public List<HttpSession> getSessions() {
synchronized (this) {
return new ArrayList<HttpSession>(sessions)
}
}
...
}