0
@AfterReturning(value = "execution(* org.springframework.data.repository.CrudRepository.save(..)) ", returning = "result")
public void repo(JoinPoint joinPoint, Object result) {
    // ... 
}

此切入点涵盖所有保存或更新操作,无论传递的参数或返回类型如何,但我只想排除参数或返回类型中的 xyz.class。这怎么可能?我不能提及所有的保存操作,因为总共有 50 多个模型,但我只想覆盖其中的 48 个。

4

3 回答 3

2
@Pointcut("execution(* com.yash.arci.repository.*.save(*))")
public void allrepository() {
}

@Pointcut("execution(* com.yash.arci.repository.AuditRepository.save(*))")
public void auditrepository() {
}

@Before(value = "allrepository() && !auditrepository()")
public void repo(JoinPoint joinPoint) {
}

这是替代解决方案。

于 2019-11-14T12:11:34.887 回答
1

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

@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) {
    // ...
}
于 2019-11-13T14:32:35.523 回答
1

记住类型的擦除,您可以做的最简单的事情就是从方法返回而不做任何事情,如果 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());
  }
于 2019-11-13T20:59:44.073 回答