Spring Boot 1.0.0-RC4从多个EmbeddedServletContainerFactory实例开始
我希望覆盖文档中描述的默认EmbeddedServletContainerFactory,以便设置SSL。(从RC1天开始)据说覆盖了定制程序,在我今天升级之前效果很好,所以更改了实现以遵循新的约定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
@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请求。