我在Spring Boot项目中找到了'TomcatEmbeddedServletContainerFactory',它可以创建一个Tomcat嵌入式实例。 我已经有一套“传统的”Spring(基于Java)配置类加上一个'AbstractAnnotationConfigDispatcherServletInitializer'实现,用于设置根应用程序上下文和控制器上下文
public class IntegrationTestDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{ServiceModuleConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebModuleConfiguration.class };
}
}
现在我尝试用
创建一个Tomcat实例TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory("/", 8080);
tomcatFactory.getEmbeddedServletContainer(???)
getEmbeddedServletContainer()需要一个来自Spring启动的ServletContextInitializer,现在我不得不将它连接到我的配置类。
Spring Boot的tomcat工厂是为支持这个而构建的吗?如果有的话,那里有任何例子吗?
答案 0 :(得分:1)
EmbeddedServletContainerFactory
确实与EmbeddedWebApplicationContext
配对(不是AnnotationConfigWebApplicationContext
获得的AbstractAnnotationConfigDispatcherServletInitializer
)。如果你想构建一个WAR文件,那么鉴于初始化程序的简单特性,你最好的选择就是使用SpringApplicationServletInitializer
代替,例如。
public class IntegrationTestDispatcherServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(ServiceModuleConfiguration.class).child(WebModuleConfiguration.class);
}
}
如果您不想要WAR文件(正如评论中所建议的那样,当我更多地考虑它时),只需创建一个SpringApplication
,如果它认为您正在尝试构建EmbeddedServletContainerFactory
一个webapp(或使用上面代码中的构建器)。
答案 1 :(得分:0)
通过Dave的更多调试和更多输入,正确的方法是显式获取子构建器实例并调用它的run()方法。这将正确启动上下文。
SpringApplicationBuilder builder = new SpringApplicationBuilder();
builder.sources(ServiceModuleConfiguration.class);
childBuilder = builder.child(WebModuleConfiguration.class, WebConfiguration.class, TomcatContainerFactoryConfiguration.class);
childBuilder.run();
WebConfiguration
包含DispatcherServlet
bean。
@Bean
public ServletRegistrationBean servletRegistrationBean() {
return new ServletRegistrationBean(new DispatcherServlet((WebApplicationContext) applicationContext), "/*");
}
TomcatContainerFactoryConfiguration
包含TomcatEmbeddedServletContainerFactory
bean
@Bean
public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory("", 8080);
}