2016-04-02 3 views
0

Я пишу код aop с sping3. Вот моя аннотация.Почему findAnnation или getAnnotation возвращает null?

@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
public @interface DataSource { 
    String name() default "foo" 
} 

И я поставил pointcut к вышеупомянутой аннотации.

<aop:pointcut id="service" expression="@annotation(com.foo.datasource.DataSource)" /> 
<aop:advisor advice-ref="dataSourceExchange" pointcut-ref="service" order="1"/> 
<bean id="dataSourceExchange" class="com.foo.datasource.DataSourceExchange"/> 

Я пишу метод сервиса и добавляю к нему приведенную выше аннотацию. В классе DataSourceExchange, который вызывается перед службой, я пытаюсь получить аннотацию.

class DataSourceExchange implements MethodInterceptor { 
    @Override 
    public Object invoke(MethodInvocation invocation) throws Throwable { 
     System.out.println("Method name : " 
       + invocation.getMethod().getName()); 
     System.out.println("Method arguments : " 
       + Arrays.toString(invocation.getArguments())); 

     DataSource dataSource = AnnotationUtils.findAnnotation(invocation.getMethod(), DataSource.class); 
     System.out.println(dataSource); 

Я правильно получил имя метода. Но аннотация dataSource просто возвращает null. В чем проблема? Я думаю, что метод сервиса, который я назвал, определенно должен быть аннотирован, иначе он не будет вызывать pointcut.

ответ

0

Я, наконец, решил вопрос, используя Method realMethod = invocation.getThis().getClass().getDeclaredMethod(proxyedMethod.getName(), proxyedMethod.getParameterTypes()); чтобы узнать реальный метод.

Для получения более подробной информации, пожалуйста, проверьте Alter dataSource in Spring By AOP And Annotation

Смежные вопросы