我有一个使用spring 4.x的应用程序,决定用spring boot 2.3.0将其迁移到spring 5.x。
该应用运行在 jetty 服务器之上,该服务器有一些特殊的配置和大量的连接器。我设法从spring中获得了嵌入式jetty服务器,并添加了连接器,但我在设置一些特定的值时遇到了困难。
我还把部分xml配置移到了注释类中--所以让我解释一下这个问题。
如果我理解正确,我的配置类应该实现这些接口。
@Configuration
public class Server implements WebServerFactoryCustomizer<JettyServletWebServerFactory>,
ServletContextInitializer
我实现了 void customize(JettyServletWebServerFactory factory)
方法从 WebServerFactoryCustomizer
在这里我添加了连接器并设置了一些值。
这看起来像这样。
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移到了注解类里 我不知道有什么办法能把initParameter指向我的注解类 它包含了所有的注解,例如 SpringBootApplication
, ComponentScan
等...
所以我在想,我将把这个(和其他的一堆东西)移到实现和覆盖的方法中,从 ServletContextInitializer
void onStartup(ServletContext servletContext)
而 javax.servlet.ServletContext
论点与 org.eclipse.jetty.servlet.ServletContextHandler
它为我提供了更多的选项,比如设置SessionHandler、ResourceHandler、ContextHandler......。(我可以设置一些ServletContext的值,但不是全部...)
任何能给我指明正确方向的帮助都将感激不尽...。
我想明白了......对于基于XML的配置,你只需要设置这个。
restContext.setInitParameter("contextConfigLocation", "classpath:application-context.xml");
对于基于类的配置,你必须设置这两个。
restContext.setInitParameter("contextClass", AnnotationConfigWebApplicationContext.class.getName());
restContext.setInitParameter("contextConfigLocation", Main.class.getName());