Spring AOP访问目标和注释值

时间:2014-09-22 10:17:49

标签: java spring validation annotations spring-aop

在我目前的设置中,我需要访问方法的注释值和目标类本身(或更准确地说,它的一部分)。

这就是我现在正在做的事情:

@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;

0 个答案:

没有答案