2016-03-24 5 views
0

Lets sagen, ich habe einfach AnmerkungWie für den Zugriff auf Annotation Variablen von Interceptor

@InterceptorBinding 
@Retention(RUNTIME) @Target({TYPE, METHOD}) 
public @interface CheckUserRole { 
    @Nonbinding String[] allowedRoles() default ""; 
} 

Als nächstes ich Abfangjäger wie folgt definiert sind:

@Interceptor 
@CheckUserRole 
public class CheckUserRoleInterceptor 

Wie kann ich allowedRoles von Annotation zugreifen? Ich mache es so:

CheckUserRole checkUserRoleAnnotation = ctx.getMethod().getAnnotation(CheckUserRole.class); 

if(checkUserRoleAnnotation != null){ 
    String[] allowedRoles = checkUserRoleAnnotation.allowedRoles(); 
} 

Aber das funktioniert nur, wenn ich Annotation auf Methode in meiner Klasse verwenden. Wenn ich meine Annotation für die ganze Klasse verwenden möchte, ist checkUserRoleAnnotationnull, da meine Methode nicht im Code mit Annotationen versehen ist.

Wie kann ich auf diese Variablen zugreifen, wenn die ganze Klasse annotiert ist?

+0

Sie können es in einer Klasse zuzugreifen, die die Anmerkung ist der Umgang mit nicht in der Klasse, in die Sie die Anmerkung selbst einfügen. @Constraint (validatedBy = Validator.class) -> In der Datei Validator.java können Sie auf die Mitglieder der Annotation zugreifen. – Stultuske

+0

Ich meine, ich möchte auf den Interceptor zugreifen. Vielleicht habe ich es nicht gut erklärt. Ich habe die Klassen 'ExampleClass' und' void exampleMethod() 'in dieser Klasse. Wenn ich 'exampleMethod()' annotiere, kann ich auf Variable im Interceptor zugreifen (wie oben beschrieben), aber wenn ich 'ExampleClass' damit annotiere, sollten alle Methoden mit Anmerkungen versehen werden, aber es gibt 'null' zurück. – deem

+0

ja, das habe ich. Was hindert Sie daran, @Constraint (validatedBy = CheckUserRoleInterceptor.class) zu Ihrer Annotation hinzuzufügen? – Stultuske

Antwort

0

Ich habe eine gute Lösung für dieses Problem gefunden. Für den Zugriff auf Annotation von Methode oder Klasse (wenn es keine Anmerkung auf Verfahren Ebene ist) nur meine Funktion:

// Returns annotation from method or class (if does not exist, returns null) 
@SuppressWarnings({ "unchecked", "rawtypes" }) 
protected Object getAnnotationClass(Class clazz, InvocationContext ctx){ 
    Object annotationClass = ctx.getMethod().getAnnotation(clazz); 

    // Try to find annotation on class level 
    if(annotationClass == null){ 
     annotationClass = ctx.getTarget().getClass().getSuperclass().getAnnotation(clazz); 
    } 

    return annotationClass; 
} 

Meine Funktion hat:

  1. Überprüfen Sie, ob es Anmerkung auf Verfahren Ebene
  2. wenn nicht, überprüfen Sie, ob Anmerkung auf Klassenebene ist
  3. wenn noch nicht, null zurück

Hinweis Verwenden .getSuperclass() seit .getClass() gibt Proxy zurück.

Anwendungsbeispiel:

CheckUserRole annotationClass = (CheckUserRole) getAnnotationClass(CheckUserRole.class, ctx); 

if(annotationClass != null){ 
    String[] allowedRoles = annotationClass.allowedRoles(); 
} 
0

Verwendung:

@Context Resourceresource;

in Ihrer Interceptor-Klasse. Mit ResourceInfo-Objekt können Sie assoziierte Klasse sowie Methode (und andere nützliche Informationen) erhalten.

nach dem Gebrauch Annotationabc abc = resourceInfo.getResourceMethod(). GetAnnotation (Annotationabc .class-) die Anmerkung oben auf ur Methode, um

Verwandte Themen