代码之家  ›  专栏  ›  技术社区  ›  Joe Taras

使用xmlWebAppInitializer方法的MessageBrokerServlet

  •  1
  • Joe Taras  · 技术社区  · 6 年前

    我想从我的Spring引导项目中删除web.xml文件。

    我正在尝试混合方法 guide )

    我有这个 MessageBrokerServlet 在我的定义 web.xml 如下:

    <servlet>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <servlet-class>flex.messaging.MessageBrokerServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>MessageBrokerServlet</servlet-name>
        <url-pattern>/messagebroker/*</url-pattern>
    </servlet-mapping>
    

    这个servlet使用一个services-config.xml文件来描述它的配置。

    在本指南中,当我用配置位置文件映射servlet时,我必须按以下方式编写:

    ServletRegistration.Dynamic dispatcher = container
          .addServlet("dispatcher", new DispatcherServlet(context));
    

    因此,我将servlet与其上下文文件链接起来,但我的messagebrokerservlet没有带参数的构造,因此我编写了以下代码:

        // MessageBrokerServlet
        XmlWebApplicationContext context = new XmlWebApplicationContext();
        context.setConfigLocation("/WEB-INF/flex/services-config.xml");
    
        MessageBrokerServlet mbs = new MessageBrokerServlet();
    
        mbs.init(context.getServletConfig());
        ServletRegistration.Dynamic messageBrokenServlet = container.addServlet("MessageBrokerServlet", mbs);
    
        messageBrokenServlet.setLoadOnStartup(1);
        messageBrokenServlet.addMapping("/messagebroker/*");
    
        container.addListener(new ContextLoaderListener(context));
    

    但当我得到 servletConfig 从上下文对象来看,它为空。

    我怎样才能通过 消息代理服务器 正确的 ServLL配置文件 ,因此我可以链接到 services-config.xml file ?

    1 回复  |  直到 6 年前
        1
  •  4
  •   M. Deinum    6 年前

    的生命周期 MessageBrokerServlet 由servlet容器处理。这在SpringBoot应用程序中没有区别(可能有点)。所以没必要打电话给 init 方法。

    这个 消息代理服务器 也与弹簧无关,因此尝试用弹簧加载配置,然后期望 消息代理服务器 采取行动也无济于事。

    使用Spring引导,您可以在应用程序上下文中将servlet简单地注册为bean,Spring引导将负责注册。注册servlet将其包装在 ServletRegistrationBean 传递init参数和进一步的配置。也见 this section 弹簧护套参考指南。

    @Bean
    public MessageBrokerServlet messageBrokerServlet() {
        return new MessageBrokerServlet();
    }
    
    @Bean
    public ServletRegistrationBean<MessageBrokerServlet> messageBrokerServletRegistration() {
        ServletRegistrationBean<MessageBrokerServlet> registration = 
            new ServletRegistrationBean(messageBrokerServlet(), "/messagebroker/*");        
        return registration;
    }
    

    把这个放在你的 @SpringBootApplication 注释类或特定的 @Configuration 带注释的类。

    这完全模拟了您在 web.xml . 如果你有其他的 init-param 块(您没有显示它们)可以使用 addInitParameter 方法将这些添加到 servletregistrationbean .