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

Spring Boot 3.1.0中使用@AspectJ拦截并修改Integer.parseInt参数失败的问题排查与方案咨询

Spring Boot 3.1.0中使用@AspectJ拦截并修改Integer.parseInt参数失败的问题排查与方案咨询

我来帮你梳理下这个问题的核心原因和可行方案:

首先得明确一个关键点:你的test1切面能生效,但是aroundParseInt不行,本质是Spring AOP的局限性导致的。

为什么两个切面表现不同?

  • 你的test1切面拦截的是bknd.Siam.Dao.cobros.D_Cobros_Admin这个类的方法,这个类是你自己项目里的,并且应该是被Spring容器管理的Bean(比如加了@Service/@Component之类的注解)。Spring AOP基于动态代理实现,只能拦截Spring容器中Bean的方法调用,所以这个切面能正常工作。
  • 而Integer.parseInt是JDK核心类的静态方法,既不是Spring Bean,也不属于你项目的类,Spring AOP的动态代理机制根本触达不到这类方法,所以你的around切面完全不会触发。

那网上说的“可以拦截第三方类方法”是怎么回事?

没错,要拦截JDK类或者第三方库的方法,必须用原生AspectJ织入,而不是Spring AOP。Spring AOP只是AspectJ的一个子集,只实现了AspectJ的注解语法,但底层用的是动态代理,只能处理Spring Bean的方法;而原生AspectJ支持编译期织入(CTW)和加载期织入(LTW),可以直接修改类的字节码,不管是不是Spring Bean、是不是静态方法都能拦截。

不用工具类的可行方案:AspectJ加载期织入(LTW)

如果你不想自己写一个工具类包装parseInt,可以用LTW来实现,步骤如下:

  1. 补充依赖:在pom.xml(或build.gradle)中添加AspectJ相关依赖:
    <!-- AspectJ Runtime -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.9.20</version>
    </dependency>
    <!-- AspectJ Weaver -->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.20</version>
    </dependency>
    <!-- Spring Aspects -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>6.0.9</version> <!-- 和Spring Boot 3.1.0对应版本匹配 -->
    </dependency>
    
  2. 开启LTW:
    • 在你的Spring Boot启动类上添加@EnableLoadTimeWeaving注解;
    • 或者在application.properties中添加配置:
      spring.aop.proxy-target-class=true
      spring.aspectj.weaving=on
      
  3. 验证切面:确保你的aroundParseInt切面的切点写法正确(你现在的execution(int java.lang.Integer.parseInt(String))是对的),可以在方法里加一句日志输出,比如System.out.println("成功拦截到Integer.parseInt调用!"),启动项目后调用Integer.parseInt就能看到日志了。

注意事项

  • 如果是用Jar包直接运行Spring Boot项目,可能需要在启动命令中加上JavaAgent参数,指定aspectjweaver的路径:
    java -javaagent:/path/to/aspectjweaver-1.9.20.jar -jar your-project.jar
    
  • 确保AspectJ的版本和Spring Boot的版本兼容,Spring Boot 3.1.0对应的Spring版本是6.0.x,AspectJ 1.9.20是兼容的。

总结一下:用Spring AOP本身是做不到拦截Integer.parseInt的,但用原生AspectJ的LTW是可以实现的,不需要自己写工具类包装。

备注:内容来源于stack exchange,提问作者Isaachjk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 13:28:06