在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中。
答案 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)
}
}
...
}