@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 {
// ...
}
}
来自参考文档: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 在他的回答中也指出)。
问题似乎重复,但现有问题的 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 {
// ...
}
}
来自参考文档: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 在他的回答中也指出)。