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?的主要内容,如果未能解决你的问题,请参考以下文章

在 grails3 中使用 mongodb 和休眠

Grails 3 - 资源插件

用于动态脚手架的Grails3控制器模板

Grails 3.0 和 Spring Security

IntelliJ 中的 Grails 3 调试

使用 Grails 3 配置 CORS