spring 在执行前用@AspectJ修改parseInt参数

wswtfjt7  于 2023-06-21  发布在  Spring
关注(0)|答案(1)|浏览(139)

我正在使用 Boot 和org.Springframework.boot:spring-boot-starter-aop
我无法使aroundParseInt方面触发。
我做了另一个方面测试(test1),这个测试正在触发。
我试图做的是拦截parseInt的参数并修改它(需要)。

import static java.lang.System.currentTimeMillis;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
public class TransformIntegerAspect {

    // THIS test aspect WORKS
    @Around("execution(* *(..)) && within(bknd.Siam.Dao.cobros.D_Cobros_Admin)")
    public Object test1(ProceedingJoinPoint thisJoinPoint) throws Throwable {
        long startTime = currentTimeMillis();
        Object result = thisJoinPoint.proceed();
        System.out.println(thisJoinPoint + " -> " + (currentTimeMillis() - startTime) + " ms");
        LoggerManager.log("ISAAC measureExecutionTime");

        return result;
    }

    //this dont work
    @Around("execution(int java.lang.Integer.parseInt(String))")
    public Object aroundParseInt(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        String param = (String) args[0];

        // Modify the parameter before the call to Integer.parseInt
        String modifiedParam = modifyParam(param);

        args[0] = modifiedParam;

        Object result = joinPoint.proceed(args);

        return result;
    }

    private String modifyParam(String param) {
        // Your custom logic to modify the parameter
        // Return the modified parameter\
        return param;
    }

配置文件中还有@EnableAspectJAutoProxy(proxyTargetClass=true)和Bean

@Bean
    public TransformIntegerAspect transformParseIntAspect() {
        return new TransformIntegerAspect();
    }

我有一些谷歌代码,不能使它工作。
也有人说这是可能的,而其他人说这是不可能的。
“如果它们是由第三方库创建的,您仍然可以使用二进制编织,创建第三方类文件的新版本并为它们创建替换JAR。作为替代,您可以使用LTW(加载时织入)并在类加载期间织入它们。
我期待着找到是否真的可能或不和一个替代的方式,而不使一个实用程序的方法。

jhkqcmku

jhkqcmku1#

Spring AOP只能拦截Spring bean/组件的方法,但您正在尝试拦截JDK方法。这是有据可查的,以前在这里被问过几十次。下次请做一些研究并阅读一些文档。
原生AspectJ可以拦截它织入的任何类中的任何方法,但是对于JDK类,当使用加载时织入时,这也可能是一个问题,因为许多(不是所有)JDK类在AspectJ织入代理之前加载,然后AspectJ修改它们就太晚了。一种间接的方法是编织调用代码,而不是包含和执行方法的类。在这种情况下,您将使用call而不是execution切入点。请注意,call在Spring AOP中不可用,这是使用原生AspectJ的第二个原因。例如:

@Around("call(int java.lang.Integer.parseInt(String))")

在您的例子中,目标方法是静态的,这就是为什么您需要原生AspectJ的原因#3,因为Spring AOP再次无法拦截静态方法。

相关问题