2016-04-02 22 views
0

私はsping3でいくつかのAOPコードを書いています。 ここに私の注釈があります。なぜfindAnnotationまたは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); 

メソッドの名前が正しく取得されます。 注釈dataSourcenullを返します。 どうしたのですか?私が呼び出すサービスメソッドは間違いなくアノテーションされていると思います。そうでなければpointcutをトリガーしません。

答えて

0

最後に、 Method realMethod = invocation.getThis().getClass().getDeclaredMethod(proxyedMethod.getName(), proxyedMethod.getParameterTypes())を使用して問題を解決しました。実際の方法を見つけることができます。

詳細については、Alter dataSource in Spring By AOP And Annotation

関連する問題