2012-05-05 2 views
5

У меня есть аннотация:Как обрабатывать атрибуты перехватчика связывания

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

и класс перехватчика для его обработки:

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

Я хотел бы добавить текст параметра:

public @interface Example { 
    String text(); 
} 

Но я не знаю, как обращаться с параметром в классе перехватчика. Как изменить аннотацию класса?

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

Если я пишу @Example(text="my text") перехватчик вызывается только тогда, когда метод/класс помечается @Example(text="my text"). Но я хочу, чтобы перехватчик вызывался независимо по значению параметра - @Example(text="other text").

И как получить значение параметра? Должен ли я использовать рефлексию или есть лучший способ?

ответ

11

Перехватчик вызывается для каждого значения атрибута, когда аннотации @Nonbinding используется.

Аннотация:

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

Interceptor:

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

Для получения значения аннотации по методу перехвата в перехватчике: InvocationContext ctx; Пример example = ctx.getMethod(). GetAnnotation (Example.class); Строковое значение = example.value(); – dbricman

+0

Что делать, если я не хочу добавлять метод по умолчанию, чтобы принудительно использовать все применения аннотации для указания значения? В моем случае это значение перечисления вместо строки, поэтому нет смысла помещать @Example (MyEnum.SPECIFIC_VALUE) в класс перехватчика. – Mano

0

Во-первых, если у вас есть только один параметр, который вы можете назвать его value, а затем можно пропустить имя параметра (по умолчанию), => может пропустить текст = часть, как:

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

Чтобы получить доступ к аннотацию вы используете метод getAnnotation на Class, Method, Field или Constructor тип, который вам нужно приобрести. Затем вы получите экземпляр аннотации, которую вы можете назвать своими методами.

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

Спасибо за ответ, но я до сих пор не знаю, как писать аннотацию для класса перехватчика. Я не могу написать просто @Example, потому что он хочет параметр. Если я пишу @Example («мой текст»), перехватчик вызывается только тогда, когда метод/класс аннотируется с помощью @Example («мой текст»). Но я хочу, чтобы перехватчик вызывался независимо по значению параметра - @Example («другой текст»). Должен ли я использовать регулярное выражение? Кажется, это не работает. – ziri

+0

Знаете ли вы, что я имею в виду? Не могли бы вы мне помочь? – ziri