Spring Boot 1.0.0-RC4从多个EmbeddedServletContainerFactory实例开始

Spring Boot 1.0.0-RC4从多个EmbeddedServletContainerFactory实例开始,spring,spring-boot,embedded-tomcat-7,Spring,Spring Boot,Embedded Tomcat 7,我希望覆盖文档中描述的默认EmbeddedServletContainerFactory,以便设置SSL。(从RC1天开始)据说覆盖了定制程序,在我今天升级之前效果很好,所以更改了实现以遵循新的约定 @Configuration public class ContainerConfig { @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFacto

我希望覆盖文档中描述的默认EmbeddedServletContainerFactory,以便设置SSL。(从RC1天开始)据说覆盖了定制程序,在我今天升级之前效果很好,所以更改了实现以遵循新的约定

@Configuration
public class ContainerConfig {

@Bean
public EmbeddedServletContainerFactory servletContainer() {
  TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
  factory.addConnectorCustomizers(new TomcatConnectorCustomizer() {

  @Override
  public void customize(Connector connector) {

    connector.setPort(8443);
    connector.setSecure(true);
    connector.setScheme("https");
    connector.setAttribute("keyAlias", "tomcat");
    connector.setAttribute("keystorePass", "changeit");
    try {
      connector.setAttribute("keystoreFile", ResourceUtils.getFile("src/ssl/tomcat.keystore").getAbsolutePath());
    } catch (FileNotFoundException e) {
      throw new IllegalStateException("Cannot load keystore", e);
    }
      connector.setAttribute("clientAuth", "false");
      connector.setAttribute("sslProtocol", "TLS");
      connector.setAttribute("SSLEnabled", true);
    }

  });

  factory.setSessionTimeout(10, TimeUnit.MINUTES);

  return factory;
}
Boot中的源代码(EmbeddedServletContainerAutoConfiguration)表明,如果它确实找到my bean,它将不会注册默认值:

@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)
然而,它似乎无论如何都注册了。还有其他人用这个吗?以下是堆栈:

线程“main”中出现异常 org.springframework.context.ApplicationContextException:无法 启动嵌入式容器;嵌套异常是 org.springframework.context.ApplicationContextException:无法 由于多个原因,启动EmbeddedWebApplicationContext EmbeddedServletContainerFactory bean: servletContainer,位于的TomcateMbeddedServletContainer工厂 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:135) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120) 在 org.springframework.boot.SpringApplication.refresh(SpringApplication.java:619) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:306) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:880) 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:869) 在 位于的sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.lang.reflect.Method.invoke(Method.java:606) com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 原因:org.springframework.context.ApplicationContextException: 由于多个原因,无法启动EmbeddedWebApplicationContext EmbeddedServletContainerFactory bean: servletContainer,位于的TomcateMbeddedServletContainer工厂 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:190) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158) 在 org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:132) ... 还有12个


我已经创建了一个混合了来自Spring Boot项目的Tomcat和Websocket示例的配置,并应用了这个配置

这是一个(某种)bug()。现在修好了。解决方法是使用
EmbeddedServletContainerCustomizer
而不是
EmbeddedServletContainerFactory
(如原始问题中的文档链接中所示)。

这应该有效(指向文档的链接是最新的,尽管它与您实现的模式不同,因为它实际上没有创建
EmbeddedServletContainerFactory类型的
@Bean
)。你能分享一个项目吗?感谢Dave的回复,我可以通过将tomcat和websockets样本放在一起进行复制-只要spring boot starter websocket是一个依赖项,就会发生这种情况,可能是因为一些与web sockets和容器相关的自动配置。如果有帮助,我可以发布两个样本的mashup。这确实是
WebSocketAutoConfiguration
这就是罪魁祸首,在这个类中创建一个bean之前检测现有的
TomcatEmbeddedServletContainerFactory
bean可能是个窍门,我将进行实验,如果可行的话,我将放入一个pull请求。