@Around Pointcut 没有被自定义注解调用

@Around Pointcut not getting invoked for custom annotation

问题似乎重复,但现有问题的 none 答案有效。 我正在创建一个自定义注释,如下所示,

@Target({ ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Translate {
}

我创建了一个方面,

@Aspect
@Configuration
public class TranslateAspect {

    @Around("@annotation(translate)")
    public Object translate(ProceedingJoinPoint joinPoint, Translate translate) throws Throwable {
        Object result = joinPoint.proceed();
        System.out.println(result); //Other logic
        return result;
    }
}

我也尝试在包中提供完整的 class 名称。实体正在传递给 RestController,

@Entity
@Getter
@Setter
public class Pojo {
    @Translate
    private String label;
 }

但是 translate 方法在处理新请求时不会被调用。

非常感谢对此的任何帮助。

尝试以下操作:

@Aspect
@Configuration
public class TranslateAspect {

    @Around("@annotation(Translate)")
    public Object translate(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result = joinPoint.proceed();
        System.out.println(result); //Other logic
        return result;
    }
}

注意 @Around("@annotation(Translate)") 中的大写“T”。


更新

刚刚注意到您希望将方面应用到使用 @Entity 注释的 class。这些实体是 JPA 实体,但它们不是 Spring-managed Bean。 Spring AOP 只处理 Spring-managed Beans 所以这是不可能的。

试试这个:

@Aspect
@Configuration
public class TranslateAspect {

    @Pointcut("@annotation(com.full.packagename.to.annotation.Translate)")
    public void anyTranslatableMethod() {
    }

    @Around("anyTranslatableMethod()")
    public Object translate(ProceedingJoinPoint joinPoint) throws Throwable {
        // ...
    }
}

这里有一个工作示例:https://github.com/asgarov1/springTricks/blob/main/aop/src/main/java/com/asgarov/aop/config/LoggingConfiguration.java

来自参考文档:5.2. Spring AOP Capabilities and Goals

Spring AOP 目前仅支持方法执行连接点(建议在 Spring bean 上执行方法)。字段拦截未实现,尽管可以在不破坏核心 Spring AOP API 的情况下添加对字段拦截的支持。如果需要通知字段访问和更新连接点,可以考虑AspectJ这样的语言。

Spring AOP 与 spring 容器管理的 bean 和建议方法执行一起工作。此处共享的代码注释了一个字段,而不是相应的 setter 方法。 PCD 定义用于执行任何 Spring 容器管理的 bean 方法,注释为 @Translate.

@Entity 注释的 class 不会将其实例注册为 Spring 托管 bean。请完成此

Pojo 实例不是 Spring 托管 bean(João Dias 在他的回答中也指出)。