在我目前的设置中,我需要访问方法的注释值和目标类本身(或更准确地说,它的一部分)。
这就是我现在正在做的事情:
@Around("@annotation(CustomAnnotation) && target(myInterface)")
public Object interruptIfEmptyExtensionOrNoConnectorFound(
ProceedingJoinPoint proceedingJoinPoint,
MyInterface myInterface) throws Throwable {
...
}
注释带有一个整数值,指定一个参数(位置)来对&进行一些检查。 MyInterface包含更多(非静态)验证信息。
如果我将Annotation添加到此方法签名中,我会得到
java.lang.IllegalArgumentException: error at ::0 formal unbound in pointcut
一旦Spring尝试加载ApplicationContext。如果我尝试更改建议中的参数顺序和/或删除" target()"从切入点进入。 (此加载目前采用SpringJUnit4ClassRunner的形式,在应用程序上下文文件中具有实现Interface作为bean的方面和类。
当然,我可以使用proceedingJoinPoint.getTarget().getClass().getDeclaredMethod(...).getAnnotations()
获取注释的值,并使用一些for-ing-ing,但是使用这种方式可以将10-15行添加到另外6行长的参数验证方法中感觉......错了。
如果"目标"我认为可能会出现here之类的内容。 class也是在advice方法签名中,但似乎我错了或者误解了那里的东西。
以下是获取注释的非工作尝试:
@Around("@annotation(CustomAnnotation) && target(myInterface)")
public Object interruptIfEmptyExtensionOrNoConnectorFound(
ProceedingJoinPoint proceedingJoinPoint,
CustomAnnotation customAnnotation,
MyInterface myInterface) throws Throwable {
...
}
@Around("@annotation(CustomAnnotation) && target(myInterface)")
public Object interruptIfEmptyExtensionOrNoConnectorFound(
ProceedingJoinPoint proceedingJoinPoint,
MyInterface myInterface,
CustomAnnotation customAnnotation,) throws Throwable {
...
}
这就是我目前检索注释的方式:
MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();
Method method = methodSignature.getMethod();
if (method.getDeclaringClass().isInterface()) {
method = proceedingJoinPoint.getTarget().getClass().getDeclaredMethod(proceedingJoinPoint.getSignature().getName(), method.getParameterTypes());
}
CustomAnnotation customAnnotation = null;
for (Annotation annotation : method.getAnnotations()) {
if (annotation.annotationType().equals(RequiresConnector.class)) {
customAnnotation = (CustomAnnotation) annotation;
}
}
return customAnnotation;