You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
    ...(省略栈跟踪)

问题分析

  1. 空指针核心原因:loggingFilter的logger字段未完成初始化就被调用,根源是AOP代理机制冲突——你的Filter被Cglib代理,但它继承的OncePerRequestFilter中doFilter、init是final方法,Cglib无法代理这些方法,导致代理对象的初始化逻辑异常,依赖注入(比如logger)失败。
  2. AOP警告关联:Cglib代理无法处理final方法的提示,直接指向了代理方式不匹配的问题。

解决步骤

1. 切换AOP代理方式为JDK动态代理

既然Cglib无法代理final方法,改用基于接口的JDK代理:

  • 在application.properties中添加配置:
    spring.aop.proxy-target-class=false
    
    或者在Spring配置类中声明:
    @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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:33:18