有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

此切入点涵盖所有保存或更新操作,而不考虑传递的参数或返回类型,但我只想排除xyz。在参数或返回类型中初始化。这怎么可能? 我不能提及所有保存操作,因为总共有50多个型号,但我只希望涵盖其中48个


共 (3) 个答案

  1. # 1 楼答案

    @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) {
    }
    

    这是另一种解决方案

  2. # 2 楼答案

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

    @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) {
        // ...
    }
    
  3. # 3 楼答案

    记住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());
      }