Grails:Grails3:doWithWebDescriptor?
Posted
技术标签:
【中文标题】Grails:Grails3:doWithWebDescriptor?【英文标题】:Grails: Grails3 : doWithWebDescriptor? 【发布时间】:2015-05-08 07:15:41 【问题描述】:我正在尝试进一步了解 grails3,但我不确定插件描述符和 doWithWebDescriptor:
src/main/groovy/grails/plugin/plugin/PluginGrailsPlugin.groovy
def doWithWebDescriptor = xml ->
def listenerNode = xml.'listener'
listenerNode[listenerNode.size() - 1] +
listener
'listener-class'(someClass.name)
我在 grails 3 下尝试了 grails install-templates,但没有生成 web.xml……我还查看了默认生成的插件描述符,它似乎没有 doWithWebDescriptor……
想知道这是否已经改变 - 它不再产生 web.xml 或者我应该怎么做才能在 grails 3 下注册一个监听器。
【问题讨论】:
这可能会有所帮助。使用弹簧靴:***.com/questions/28566261/… 感谢 Joshua 将在周末尝试一下 【参考方案1】:我已经设法让默认的 tomcat websocket 侦听器通过 spring boot grails 应用程序工作:
这里有记录:
https://github.com/vahidhedayati/testwebsocket-grails3
我决定更新这篇文章,并包含我迄今为止在此问题上的所有发现。
更具体地说,您的应用程序 grails-app/init 文件夹中的 application.groovy:
这个 bean 启动默认的 tomcat websocket 监听器:
@Bean
public ServletListenerRegistrationBean<AnotherWebSocketHandler> httpSessionEventPublisher()
return new ServletListenerRegistrationBean<AnotherWebSocketHandler>(new AnotherWebSocketHandler());
虽然在插件中重复使用,但发现是:
上述项目是一个基本的 grails 应用程序,它做了两件事,一个基本的 spring socket 以及 java 1.X Websocket:
Here is how to use Default websocket in a grails 3 plugin
在你plugin descriptor你有这样的东西:
Closure doWithSpring()
->
wsChatConfig DefaultWsChatConfig
在这个插件中我留下了两种启动监听器的方法:
@Bean
public ServletContextInitializer myInitializer()
return new ServletContextInitializer()
@Override
public void onStartup(ServletContext servletContext) throws ServletException
servletContext.addListener(WsCamEndpoint)
servletContext.addListener(WsChatFileEndpoint)
// Alternative way
@Bean
public ServletListenerRegistrationBean<WsChatEndpoint> httpSessionEventPublisher()
return new ServletListenerRegistrationBean<WsChatEndpoint>(new WsChatEndpoint())
top 方法非常方便,因为您只能初始化 1 个 ServletListenerRegistrationBean,而我不得不求助于 top 方法来启用其他侦听器...我可以只使用 top primary 进行所有调用。留作日后参考。
有了这个,spring boot 现在可以模拟 web.xml 在注册监听器时的模拟。从那里加载 websocket 的实际 groovy 类保持原样,即使用默认的 websocket 调用,例如 onOpen onMessage 等。
【讨论】:
【参考方案2】:从 Grails 3 开始,在插件方法 doWithSpring
中使用 spring 注册 bean 添加运行时配置的新方法。 doWithWebDescriptor
不再使用。
这应该适用于Servlet Listeners:
Closure doWithSpring() ->
MyListener(ServletListenerRegistrationBean)
listener = bean(someClass)
order = Ordered.HIGHEST_PRECEDENCE
免责声明:我没有测试此代码。
请参阅Gails documentation。
【讨论】:
以上是关于Grails:Grails3:doWithWebDescriptor?的主要内容,如果未能解决你的问题,请参考以下文章