2012-05-05 9 views
5

que tienen una anotación:Cómo manejar atributos de enlace de interceptor

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

y una clase interceptor para su manejo:

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

me gustaría añadir un texto de parámetro:

public @interface Example { 
    String text(); 
} 

Pero no sé cómo manejar el parámetro en la clase de interceptor. ¿Cómo modificar la anotación de la clase?

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

Si escribo @Example(text="my text"), el interceptor se llama justo cuando un método/clase se anota con @Example(text="my text"). Pero quiero que el interceptor se llame independientemente en un valor de parámetro - @Example(text="other text").

¿Y cómo obtener el valor del parámetro? ¿Tengo que usar la reflexión o hay una mejor manera?

Respuesta

11

El interceptor se llama para cada valor de atributo cuando se usa la anotación @Nonbinding.

Anotación:

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

Interceptor:

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

Para obtener el valor de la anotación en el método interceptado en el interceptor: InvocationContext ctx; Ejemplo example = ctx.getMethod(). GetAnnotation (Example.class); Valor de cadena = example.value(); – dbricman

+0

¿Qué sucede si no deseo agregar un método predeterminado para forzar todos los usos de la anotación para especificar un valor? En mi caso, es un valor enum en lugar de una cadena, por lo que tiene poco sentido poner @Example (MyEnum.SPECIFIC_VALUE) en la clase de interceptor. – Mano

0

En primer lugar, si sólo tiene un parámetro que puede nombrarlo value y luego se puede omitir el nombre del parámetro (por defecto), => puede omitir el texto = parte, como:

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

Para acceder a una anotación utiliza el método getAnnotation en el tipo Class, Method, Field o Constructor que debe obtener primero. Luego obtienes una instancia de la anotación a la que puedes llamar tus métodos.

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

Gracias por la respuesta, pero todavía no saben cómo escribir la anotación para la clase de interceptor. No puedo escribir simplemente @Example porque quiere un parámetro. Si escribo @Example ("mi texto"), se llama al interceptor solo cuando se anota un método/clase con @Example ("mi texto"). Pero quiero que el interceptor sea llamado independientemente en el valor del parámetro - @ Ejemplo ("otro texto"). ¿Debería usar expresión regular? No parece funcionar. – ziri

+0

¿Sabes lo que quiero decir? ¿Podrías ayudarme con esto? – ziri

Cuestiones relacionadas