2016-04-02 11 views
0

Ich schreibe etwas AOP-Code mit sping3. Hier ist meine Anmerkung.Warum findAnnotation oder getAnnotation gibt null zurück?

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

Und ich ein pointcut auf die obige Anmerkung.

<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"/> 

Ich schreibe eine Service-Methode und füge die obige Annotation hinzu. In der Klasse DataSourceExchange, die vor dem Dienst aufgerufen wird, versuche ich die Annotation zu bekommen.

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

Ich bekomme den Namen der Methode richtig. Aber die Annotation dataSource gibt nur null zurück. Was ist das Problem? Ich denke, dass die Service-Methode, die ich angerufen habe, definitiv annotation-ed ist, andernfalls wird es das pointcut nicht auslösen.

Antwort

0

Ich löste schließlich die Frage mit Method realMethod = invocation.getThis().getClass().getDeclaredMethod(proxyedMethod.getName(), proxyedMethod.getParameterTypes()); um die wahre Methode herauszufinden.

Für weitere Details überprüfen Sie

Verwandte Themen