我希望覆盖此处记录的默认 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 示例混合在一起,并应用了此配置。