将 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包含所有注释,例如 SpringBootApplication
、ComponentScan
等...
所以我在想,我将把这个(和其他一些东西)移动到 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());
我有一个使用 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包含所有注释,例如 SpringBootApplication
、ComponentScan
等...
所以我在想,我将把这个(和其他一些东西)移动到 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());