将 Jetty 迁移到 SpringBoot Jetty

Migrating Jetty to SpringBoot Jetty

我有一个使用 spring 4.x 的应用程序,并决定将其迁移到 spring 5.x spring boot 2.3.0。

该应用程序 运行 在具有一些特殊配置和相当多连接器的码头服务器之上。我设法从 spring 获取了嵌入式码头服务器并添加了连接器,但我正在努力设置一些特定值。

我还将 xml 配置的一部分移动到带注释的 classes - 所以让我解释一下这个问题。

如果我理解正确,我的配置 class 应该实现这些接口:

@Configuration
public class Server implements WebServerFactoryCustomizer<JettyServletWebServerFactory>,
                               ServletContextInitializer

我从 WebServerFactoryCustomizer 实现 void customize(JettyServletWebServerFactory factory) 方法,在其中添加连接器并设置一些值。

看起来像这样:

void customize(JettyServletWebServerFactory factory) {
   factory.addServerCustomizers(jettyServer -> {
       jettyServer.addConnector(new ServerConnector(server, sslContextFactory));
       ...

       // ---the part of the old code---
                final ServletHolder servletHolder = new ServletHolder(new CXFServlet());
        final ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);

        context .setContextPath("/");
        context .addServlet(servletHolder, "/*");
        context .addFilter(MyCustomFilter.class, "/*", EnumSet.allOf(DispatcherType.class));
        context .addEventListener( new ContextLoaderListener() );

        // the problematic line
        restContext.setInitParameter("contextConfigLocation", "classpath:application-context.xml");

       // ---
   }
}

问题是我将所有配置从 XML 移到了带注释的 class,但我不知道如何将 initParameter 指向带注释的 class包含所有注释,例如 SpringBootApplicationComponentScan 等...

所以我在想,我将把这个(和其他一些东西)移动到 ServletContextInitializer void onStartup(ServletContext servletContext) 的实现和重写方法,但是 javax.servlet.ServletContext 参数并不完全相同as org.eclipse.jetty.servlet.ServletContextHandler 它为我提供了更多选项,例如设置 SessionHandler、ResourceHandler、ContextHandler...(我能够将一些值设置为 ServletContext 但不是全部...)

感谢任何能为我指明正确方向的帮助...

所以我想通了... 对于基于 XML 的配置,您只需这样设置:

restContext.setInitParameter("contextConfigLocation", "classpath:application-context.xml");

对于基于class的你必须设置这两个:

    restContext.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName());
    restContext.setInitParameter("contextConfigLocation", Main.class.getName());