Сервлеты и фильтры зарегистрированы как 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 ищет ServletRegistrationBeans, FilterRegistrationBeans и т. д. и использует их настроенные свойства для программной регистрации в контейнере сервлетов.

Есть несколько примеров в источнике 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)
        }
    }
    ...
}
Другие вопросы по тегам