Spring Boot从Java 8升级到Java 21后启动报错求助
Spring Boot 3.2 + Java 21 升级启动报错排查与解决
问题背景
将Spring Boot应用从Java 8+Spring Boot 2.2升级到Java 21+Spring Boot 3.2后,启动时出现以下错误及警告:
|WARN | o.s.b.a.o.j.JpaBaseConfiguration$JpaWebConfiguration(232) |> spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning |WARN | o.s.aop.framework.CglibAopProxy (288) |> Unable to proxy interface-implementing method [public final void org.springframework.web.filter.OncePerRequestFilter.doFilter(jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse,jakarta.servlet.FilterChain) throws jakarta.servlet.ServletException,java.io.IOException] because it is marked as final, consider using interface-based JDK proxies instead. |WARN | o.s.aop.framework.CglibAopProxy (288) |> Unable to proxy interface-implementing method [public final void org.springframework.web.filter.GenericFilterBean.init(jakarta.servlet.FilterConfig) throws jakarta.servlet.ServletException] because it is marked as final, consider using interface-based JDK proxies instead. |ERROR| o.a.c.c.C.[Tomcat].[localhost].[/] (175) |> Exception starting filter [loggingFilter] Cannot invoke "org.apache.commons.logging.Log.isDebugEnabled()" because "this.logger" is null at org.springframework.web.filter.GenericFilterBean.init(GenericFilterBean.java:239) ...(省略栈跟踪)
问题分析
- 空指针核心原因:
loggingFilter的logger字段未完成初始化就被调用,根源是AOP代理机制冲突——你的Filter被Cglib代理,但它继承的OncePerRequestFilter中doFilter、init是final方法,Cglib无法代理这些方法,导致代理对象的初始化逻辑异常,依赖注入(比如logger)失败。 - AOP警告关联:Cglib代理无法处理final方法的提示,直接指向了代理方式不匹配的问题。
解决步骤
1. 切换AOP代理方式为JDK动态代理
既然Cglib无法代理final方法,改用基于接口的JDK代理:
- 在
application.properties中添加配置:
或者在Spring配置类中声明:spring.aop.proxy-target-class=false
注意:确保你的@Configuration public class AopConfig { @Bean public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator() { DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator(); proxyCreator.setProxyTargetClass(false); // 启用JDK代理 return proxyCreator; } }loggingFilter实现了jakarta.servlet.Filter接口(Spring Boot 3.x已全面切换到Jakarta EE规范)。
2. 修正自定义Filter的实现逻辑
如果loggingFilter是自定义的:
- 不要重写
init方法(它是final的),改用GenericFilterBean提供的initFilterBean()钩子方法做初始化逻辑。 - 确保Filter由Spring容器管理,用
@Component注解或@Bean方法注入,避免手动创建实例导致依赖注入失败。
3. 排查并修复依赖版本冲突
Spring Boot 3.2有严格的依赖版本管控:
- 移除所有
javax.*开头的依赖,替换为对应的jakarta.*依赖(比如javax.servlet→jakarta.servlet-api)。 - 使用Maven的
mvn dependency:tree或Gradle的gradle dependencies命令检查依赖树,确保所有Spring相关依赖的版本与Spring Boot 3.2对齐(Spring Boot 3.2对应Spring Framework 6.1.x)。
4. 消除JPA警告(可选)
在application.properties中显式配置参数关闭警告:
spring.jpa.open-in-view=false
内容的提问来源于stack exchange,提问作者Sudan Shrestha
相关产品推荐
相关产品推荐

