Spring AOP切入点表达式,不包括特定的返回类型或参数

问题描述 投票:0回答:2
@AfterReturning(value = "execution(* org.springframework.data.repository.CrudRepository.save(..)) ", returning = "result")
public void repo(JoinPoint joinPoint, Object result) {
    // ... 
}

此切入点涵盖了所有保存或更新操作,而与传递的参数或返回类型无关,但是我只想在参数或返回类型中排除xyz.class。那怎么可能?我不能提及所有保存操作,因为总共有50多个模型,但是我只希望涵盖其中的48个。

java spring spring-boot spring-aop spring-aspects
2个回答
0
投票

您声明包含和排除的方法签名,并像这样组合它们

@Pointcut("execution(* org.springframework.data.repository.CrudRepository.save(..))")
public void any() {
}

@Pointcut("execution(* org.springframework.data.repository.CrudRepository.save(MyClass1))" +
        " || execution(* org.springframework.data.repository.CrudRepository.save(MyClass2))")
public void excluded() {
}

@AfterReturning(value = "any() && !excluded()", returning = "result")
public void repo(JoinPoint joinPoint, Object result) {
    // ...
}

0
投票

[牢记erasure of a type,您可以做的最简单的事情就是,如果arg类型为XYZ,则不做任何事情就从方法返回。

@Pointcut("execution(* org.springframework.data.repository.CrudRepository+.save(..))")
  public void savePointCut() {
    // savePointCut
  }

  @AfterReturning(value = "savePointCut()", returning = "result")
  public void afterReturning(JoinPoint joinPoint, Object result) {
    if (joinPoint.getArgs()[0] instanceof XYZ) return;
    logger.info("AfterReturning :[{}]", joinPoint.getArgs());
  }
© www.soinside.com 2019 - 2024. All rights reserved.