Spring Boot 1.0.0-RC4以多个EmbeddedServletContainerFactory实例启动

时间:2014-03-11 21:26:32

标签: spring spring-boot embedded-tomcat-7

我希望覆盖默认的EmbeddedServletContainerFactory,如文档here所示,以便设置SSL。 old docs(来自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)中的源代码表明如果找到我的bean,它将不会注册默认值:

@ConditionalOnMissingBean(value = EmbeddedServletContainerFactory.class, search = SearchStrategy.CURRENT)

然而无论如何它似乎都要注册。有没有人有这个工作?这是堆栈:

  

线程“main”中的异常   org.springframework.context.ApplicationContextException:无法   启动嵌入式容器;嵌套异常是   org.springframework.context.ApplicationContextException:无法   由于多个启动EmbeddedWebApplicationContext   EmbeddedServletContainerFactory bean:   servletContainer,tomcatEmbeddedServletContainerFactory at   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)     在     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:606)at   com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)   引起:org.springframework.context.ApplicationContextException:   由于多个而无法启动EmbeddedWebApplicationContext   EmbeddedServletContainerFactory bean:   servletContainer,tomcatEmbeddedServletContainerFactory at   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个

我创建了一个GitHub repo,用于修复Spring Boot项目中的Tomcat和Websocket示例,并应用此配置。

1 个答案:

答案 0 :(得分:2)

这是一种(某种)错误(https://github.com/spring-projects/spring-boot/issues/479)。现在修复了。解决方法是使用EmbeddedServletContainerCustomizer代替EmbeddedServletContainerFactory(如原始问题中的文档链接)。