Spring Boot 3.2.0-M3集成Vaadin Flow启动抛BeanCreationException求助
问题
测试Spring Boot v3.2(-M3)环境下的Vaadin Flow时,启动过程抛出BeanCreationException异常,该场景在Spring Boot v3.1中可正常运行,请问是否需要调整启动配置?
异常堆栈跟踪信息:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'vaadinApplicationContextInitializer' defined in class path resource [com/vaadin/flow/spring/VaadinApplicationConfiguration.class]: The underlying ServletContext of VaadinServletContext is null and there is no VaadinServletService to obtain it from. at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:523) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:973) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:939) ~[spring-context-6.1.0-M5.jar:6.1.0-M5] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:608) ~[spring-context-6.1.0-M5.jar:6.1.0-M5] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.0-M3.jar:3.2.0-M3] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-3.2.0-M3.jar:3.2.0-M3] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) [spring-boot-3.2.0-M3.jar:3.2.0-M3] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-3.2.0-M3.jar:3.2.0-M3] at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:149) [spring-boot-3.2.0-M3.jar:3.2.0-M3] at it.xxx.xxx.Application.main(Application.java:57) [main/:?] Caused by: java.lang.IllegalStateException: The underlying ServletContext of VaadinServletContext is null and there is no VaadinServletService to obtain it from. at com.vaadin.flow.server.VaadinServletContext.ensureServletContext(VaadinServletContext.java:62) ~[flow-server-24.2.0.beta2.jar:24.2.0.beta2] at com.vaadin.flow.server.VaadinServletContext.getAttribute(VaadinServletContext.java:69) ~[flow-server-24.2.0.beta2.jar:24.2.0.beta2] at com.vaadin.flow.server.VaadinContext.getAttribute(VaadinContext.java:58) ~[flow-server-24.2.0.beta2.jar:24.2.0.beta2] at com.vaadin.flow.spring.SpringLookupInitializer$SpringApplicationContextInit.setApplicationContext(SpringLookupInitializer.java:161) ~[vaadin-spring-24.2.0.beta2.jar:?] at org.springframework.context.support.ApplicationContextAwareProcessor.invokeAwareInterfaces(ApplicationContextAwareProcessor.java:112) ~[spring-context-6.1.0-M5.jar:6.1.0-M5] at org.springframework.context.support.ApplicationContextAwareProcessor.postProcessBeforeInitialization(ApplicationContextAwareProcessor.java:87) ~[spring-context-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInitialization(AbstractAutowireCapableBeanFactory.java:421) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1767) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-6.1.0-M5.jar:6.1.0-M5] ... 14 more
解决方案
这个问题是Spring Boot 3.2的Servlet上下文初始化时机调整,与Vaadin 24.2 beta版本不兼容导致的,可通过以下方式解决:
- 优先升级Vaadin版本:直接升级到Vaadin 24.2正式版或24.2.0.beta3及以上的beta版本,官方已修复Spring Boot 3.2的适配问题。
- 临时调整启动配置(无法升级时):
- 添加JVM启动参数,跳过Vaadin的自动初始化:
-Dvaadin.spring.context.initializer.ignore=true - 或者自定义配置类,手动控制Vaadin Servlet的初始化时机:
@Configuration public class VaadinServletConfig { @Bean public ServletRegistrationBean<VaadinServlet> vaadinServlet() { VaadinServlet servlet = new VaadinServlet(); ServletRegistrationBean<VaadinServlet> registration = new ServletRegistrationBean<>(servlet, "/*"); registration.setLoadOnStartup(1); return registration; } }
- 添加JVM启动参数,跳过Vaadin的自动初始化:
- 检查自动配置状态:确保未禁用Spring Boot的Servlet自动配置,避免ServletContext无法正常初始化。
原因说明
Spring Boot 3.2对WebApplicationContext的初始化流程做了调整,ServletContext的创建时机比3.1版本更晚,而旧版Vaadin的vaadinApplicationContextInitializer在初始化时依赖已就绪的ServletContext,因此触发了空指针异常。
内容的提问来源于stack exchange,提问作者Kruntz
相关产品推荐
相关产品推荐

