无法在 Spring AOP 中检测到 class 级别的自定义注释
Unable to detect class level custom annotation in Spring AOP
我正在尝试使用以下设置在 Spring 中拦截 classes
拦截器
@Aspect
@Component
public class MyInterceptor {
@Around("execution(* com.example.services..*(..))")
public Object intercept(ProceedingJoinPoint pjp) throws Throwable {
if (pjp.getTarget() != null && pjp.getTarget().getClass().getAnnotation(MyAnnotation.class) != null) {
System.out.println("Yes annotation present");
} else {
System.out.println("Annotation not present");
}
return = pjp.proceed();
}
}
而被拦截的class如下
@Component
@MyAnnotation
public class MyAlert implements IAlert {
}
一切正常,除非我进行以下更改
@Configuration
@PropertySource(value = { "file:${catalina.home}/conf/my.properties" })
@Component
@MyAnnotation
public class MyAlert implements IAlert {
@Autowired
private Environment environment;
}
我想读取位于 tomcat7 的 conf 文件夹中的属性,进行这些更改后我的拦截器无法读取我的自定义注释 @MyAnnotation
。它说(用拦截器编写的自定义消息)
Annotation not present
这是自定义注释
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
我真的希望 class 应该被拦截,并且如果有注释,则必须在 class 上检测到注释。我还想从截获的 class.
中的 conf 文件夹中读取属性
您对注释的检查失败,因为您正在检查动态代理的类型而不是实际注释的 class 类型。您可以像这样解决它:
pjp.getSignature().getDeclaringType().getAnnotation(RestController.class) != null
我正在尝试使用以下设置在 Spring 中拦截 classes
拦截器
@Aspect
@Component
public class MyInterceptor {
@Around("execution(* com.example.services..*(..))")
public Object intercept(ProceedingJoinPoint pjp) throws Throwable {
if (pjp.getTarget() != null && pjp.getTarget().getClass().getAnnotation(MyAnnotation.class) != null) {
System.out.println("Yes annotation present");
} else {
System.out.println("Annotation not present");
}
return = pjp.proceed();
}
}
而被拦截的class如下
@Component
@MyAnnotation
public class MyAlert implements IAlert {
}
一切正常,除非我进行以下更改
@Configuration
@PropertySource(value = { "file:${catalina.home}/conf/my.properties" })
@Component
@MyAnnotation
public class MyAlert implements IAlert {
@Autowired
private Environment environment;
}
我想读取位于 tomcat7 的 conf 文件夹中的属性,进行这些更改后我的拦截器无法读取我的自定义注释 @MyAnnotation
。它说(用拦截器编写的自定义消息)
Annotation not present
这是自定义注释
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
}
我真的希望 class 应该被拦截,并且如果有注释,则必须在 class 上检测到注释。我还想从截获的 class.
中的 conf 文件夹中读取属性您对注释的检查失败,因为您正在检查动态代理的类型而不是实际注释的 class 类型。您可以像这样解决它:
pjp.getSignature().getDeclaringType().getAnnotation(RestController.class) != null