1

我希望覆盖此处记录的默认 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) 中的源代码表明,如果它确实找到了我的 bean,它不会注册默认值:

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

但是它似乎无论如何都要注册。其他人有这个工作吗?这是堆栈:

线程“主”org.springframework.context.ApplicationContextException 中的异常:无法启动嵌入式容器;嵌套异常是 org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to multiple EmbeddedServletContainerFactory beans : servletContainer,tomcatEmbeddedServletContainerFactory at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:135) at org.springframework。 context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java: 619)在组织。

我创建了一个GitHub 存储库,它将 Spring Boot 项目中的 Tomcat 和 Websocket 示例混合在一起,并应用了此配置。

4

1 回答 1

2

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

于 2014-03-12T11:09:16.530 回答