MessageBrokerServlet 与 XmlWebAppInitializer 方法

MessageBrokerServlet with XmlWebAppInitializer approach

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

我正在尝试一种混合方法(如此 guide)。

我在 web.xml 中将此 MessageBrokerServlet 定义如下:

<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));

所以我 link 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 时,它是空的。

我如何才能将正确的 servletConfig 传递给 MessageBrokerServlet,以便我可以 link 编辑到 services-config.xml file

MessageBrokerServlet 的生命周期由 servlet 容器处理。这在 Spring 引导应用程序中没有区别(可能有点)。所以不需要调用 init 方法。

MessageBrokerServlet 也与 Spring 无关,因此尝试使用 Spring 加载配置,然后期望 MessageBrokerServlet 对其执行操作不会做任何事情。

使用 Spring Boot,您可以简单地将 servlet 注册为应用程序上下文中的 bean,Spring Boot 将负责注册。要注册 servlet,请将其包装在 ServletRegistrationBean 中以传递初始化参数和进一步配置。另请参阅 Spring 引导参考指南的 this section

@Bean
public MessageBrokerServlet messageBrokerServlet() {
    return new MessageBrokerServlet();
}

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

将此放在您的 @SpringBootApplication 注释 class 或特定 @Configuration 注释 class 中。

这完全模仿了您在 web.xml 中发布的内容。如果您有额外的 init-param 块(您没有显示它们),您可以使用 addInitParameter 方法将它们添加到 ServletRegistrationBean