Servlets和过滤器在Grails中注册为Spring Beans而不是web.xml

时间:2015-09-14 12:28:52

标签: spring grails

在Grails 'Upgrading from 2.x to 3.0.6' document中,已经注意到"新的servlet和过滤器可以分别注册为Spring bean或ServletRegistrationBean和FilterRegistrationBean"但是在这个问题上没有其他说法。

我想知道是否有人对如何正确地执行此操作有任何好的意见(即,使用包含servlet上下文来加载bean的init / BootStrap.groovy,而不是conf / spring中的bean)或者可能有一些pre -defined这样做的春天方式很明显而且我很遗憾。

注意:我正在尝试将spring-ws集成到Grails 3.0.6中。

2 个答案:

答案 0 :(得分:5)

您应该在doWithSpring中为插件执行此操作,或grails-app/conf/spring/resources.groovy在应用中执行此操作。由于Grails 3基于Spring Boot,您还可以使用@Bean方法。

当应用程序上下文启动时,Spring会查找ServletRegistrationBean s,FilterRegistrationBean等,并使用其配置的属性为您在servlet容器中进行编程注册。

Grails源代码中有一些例子。 ControllersGrailsPlugin注册了一些过滤器(例如here),并且主调度程序servlet已注册here

Spring Boot docs中有一些文档,虽然它偏向于@Bean方法,但您可以使用任何方法来定义bean。

答案 1 :(得分:0)

(适用于Grails 3(特别是版本3.3.3的版本))

使用插件描述符文件(* GrailsPlugin.groovy)的“ doWithSpring ”部分,将自定义监听器添加到 servletContext

步骤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)
        }
    }
    ...
}