2012-04-20 9 views
10

że mam metoda tak:Wiosną AOP punktu przekroju dla adnotacjami argumentu

public void method(@CustomAnnotation("value") String argument) 

Czy istnieje wyrażenie punktu przekroju, który może wybrać wszystkie metody z argumentami opatrzone @CustomAnnotation? Jeśli tak, to w jaki sposób mogę uzyskać dostęp, przejdź do argumentu "wartość"?

Odpowiedz

14

Na podaj argumenty:

@Before("execution(* *(@CustomAnnotation (*)))") 
public void advice() { 
System.out.println("hello"); 
} 

ref: http://forum.springsource.org/archive/index.php/t-61308.html

Na uzyskanie param dopiskiem

MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 
Method method = signature.getMethod(); 
Annotation[][] methodAnnotations = method.getParameterAnnotations(); 

będzie Ci adnotacje, które można iteracyjne i używać instanceof znaleźć związana adnotacja. Wiem, że to jest hacky, ale afaik to jedyny sposób, który jest obecnie wspierany.

+2

Trzeba dodać spację po adnotacji tj @ CustomAnnotation (*) –

1

Z Dokumentów wiosny:

@Before("@annotation(myAnnotation)") 
public void audit(Auditable myAnnotation) { 
    AuditCode code = auditable.value(); 
    // ... 
} 

Który działa dobrze dla mnie, bez konieczności manipulowania podpis metody.

Uwaga: Jeśli używasz nazwanego punku cięcia, ponieważ nazwy punktów mogą być przeciążone, musisz podać sygnatury pasujące (nazwa i kolejność parametrów).

@Before("goodAdvise(myAnnotation)") 
public void audit(Auditable myAnnotation) { 
    String value = auditable.value(); 
    // ... 
} 

@Pointcut("@annotation(myAnnotation)") 
public void goodAdvise(Auditable myAnnotation) { 
    //empty 
} 
+0

Adnotacje "adnotacji" odnoszą się do adnotacji w metodzie, a nie do parametrów. –

0

Jeśli masz więcej niż jeden parametr w metodzie należy użyć również dwie kropki na mathing dowolną liczbę parametrów (zero lub więcej)

@Before("execution(* *(@CustomAnnotation (*), ..))") 
public void advice() { 
    System.out.println("hello"); 
} 
Powiązane problemy