2012-05-05 10 views
5

mam adnotację:Jak obsługiwać atrybuty wiązania kolektora

@Inherited 
@InterceptorBinding 
@Retention(RUNTIME) 
@Target({METHOD, TYPE}) 
public @interface Example { 
} 

oraz klasę przechwytywania do jego użytkowania:

@Interceptor 
@Example 
public class ExampleInterceptor implements Serializable { 
... 
} 

Chciałbym dodać tekst parametru:

public @interface Example { 
    String text(); 
} 

Ale nie wiem, jak obsługiwać parametr w klasie przechwytywania. Jak zmodyfikować adnotację klasy?

@Interceptor 
@Example(text=???????) 
public class ExampleInterceptor implements Serializable { 
... 
} 

Jeśli piszę @Example(text="my text"), przechwytujący nazywa się właśnie wtedy, gdy metoda/klasy jest opatrzone @Example(text="my text"). Ale chcę, aby przechwytywacz był nazywany niezależnie od wartości parametru - @Example(text="other text").

A jak uzyskać wartość parametru? Czy muszę używać reflexion, czy jest lepszy sposób?

Odpowiedz

11

Interceptor jest wywoływana dla każdej wartości atrybutu, gdy używany jest adnotacja @Nonbinding.

Adnotacja:

public @interface Example { 
    @Nonbinding String text() default ""; 
} 

Interceptor:

@Interceptor 
@Example 
public class ExampleInterceptor implements Serializable { 
    ... 
} 
+1

Aby uzyskać wartość adnotacji na przechwyconej metodzie w przechwytywaczu: InvocationContext ctx; Przykładowy przykład = ctx.getMethod(). GetAnnotation (Example.class); Wartość ciągu = przykład.value(); – dbricman

+0

Co się stanie, jeśli nie chcę dodawać domyślnej metody wymuszania wszystkich zastosowań adnotacji w celu określenia wartości? W moim przypadku jest to wartość wyliczeniowa zamiast łańcucha, więc nie ma sensu umieszczać @ Example (MyEnum.SPECIFIC_VALUE) na klasie przechwytującej. – Mano

0

Po pierwsze, jeśli masz tylko jeden parametr można nazwać to value i może pominąć nazwę parametru (domyślne), => Można pominąć tekst = część, jak:

@Example("my text") //instead of @Example(test="My text") 
public class ... 

Aby uzyskać dostęp do adnotacji używasz metody getAnnotation typu Class, ,, Następnie dostajesz instancję adnotacji, na którą możesz wywoływać swoje metody.

Example example = getClass().getAnnotation(); //if you are inside the interceptor you can just use getClass(), but you have to get the class from somewhere 
example.value(); //or example.text() if you want your annotation parameter to be named text. 
+0

Dziękuję za odpowiedź, ale ja nadal nie wiem jak napisać notatkę dla klasy przechwytujących. Nie mogę napisać tylko @ Sample, ponieważ jest to parametr. Jeśli piszę @ Sample ("mój tekst"), przechwytywacz jest wywoływany właśnie wtedy, gdy metoda/klasa jest opatrzona adnotacją @Example ("mój tekst"). Ale chcę, aby przechwytywacz był nazywany niezależnie wartością parametru - @Ekspres ("inny tekst"). Czy powinienem używać wyrażenia regularnego? To nie działa. – ziri

+0

Czy wiesz o co mi chodzi? Czy mógłbyś mi z tym pomóc? – ziri