我希望覆盖默认的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示例,并应用此配置。
答案 0 :(得分:2)
这是一种(某种)错误(https://github.com/spring-projects/spring-boot/issues/479)。现在修复了。解决方法是使用EmbeddedServletContainerCustomizer
代替EmbeddedServletContainerFactory
(如原始问题中的文档链接)。