如何将TomcatEmbeddedServletContainerFactory与AbstractAnnotationConfigDispatcherServletInitializer一起使用

时间:2014-02-12 15:42:34

标签: tomcat spring-boot

我在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工厂是为支持这个而构建的吗?如果有的话,那里有任何例子吗?

2 个答案:

答案 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, TomcatContainerFactoryConfigur‌​ation.class);
    childBuilder.run();

WebConfiguration包含DispatcherServlet bean。

    @Bean
    public ServletRegistrationBean servletRegistrationBean() {
        return new ServletRegistrationBean(new DispatcherServlet((WebApplicationContext) applicationContext), "/*");
    }

TomcatContainerFactoryConfigur‌​ation包含TomcatEmbeddedServletContainerFactory bean

    @Bean
    public EmbeddedServletContainerFactory embeddedServletContainerFactory() {
        return new TomcatEmbeddedServletContainerFactory("", 8080);
    }