2013-08-04 1 views
0

J'ai essayé de définir l'attribut logTime dans mon annotation au printemps xml. Je vois que ce n'est pas aussi facile que je le pensais.définition des attributs d'annotation au printemps xml

@Component 
@Retention(RetentionPolicy.RUNTIME) 
public @interface LogExecTime { 

public boolean logTime() default true;  
} 

J'ai essayé d'utiliser l'annotation @Value avec l'interface sans chance:

I) 

    @Component 
    @Retention(RetentionPolicy.RUNTIME) 
    public @interface LogExecTime { 
    @Value("#{ConfigureAnnotation.doLogging}") 
public boolean logTime() default true;  
    } 

et aussi

II)  
@LogExecTime([email protected]("#{ConfigureAnnotation.doLogging}")) 

Toute idée comment je peux le faire au niveau xml ou est ce n'est pas possible avec l'injection de dépendance d'annotation?

Répondre

1

Oui, ça ne marchera jamais.

@LogExecTime([email protected]("#{ConfigureAnnotation.doLogging}")) 

ne compilera jamais. Les annotations ne sont pas des codes exécutables, ce sont juste des marqueurs - un peu plus d'informations qui sont insérées dans la vente entière du fichier de classe.

Vous pouvez soit mettre ceci:

@Value("#{ConfigureAnnotation.doLogging}") 
boolean logTime = true; 

Comme un champ réel sur un ressort bean géré quelque part, ou avoir changé l'annotation être comme:

@Component 
@Retention(RetentionPolicy.RUNTIME) 
public @interface LogExecTime { 

    public String logTime() default "true"; 
} 

et ont tout ce qui est le traitement que Les annotations au moment de l'exécution acceptent également une expression EL printanière et la résolvent de manière appropriée, et votre composant ressemblerait à ceci:

@LogExecTime(logTime = "#{ConfigureAnnotation.doLogging}") 
public class SomeComponent { 

    // blah blah blah 
} 
+0

Salut Iscoughlin. @Value("#{ConfigureAnnotation.doLogging}") boolean logTime = true; ne fonctionne pas dans une annotation pour moi, mais le logTime = "#{ConfigureAnnotation.doLogging}" ressemble à ce qu'il pourrait. Mon Aspect le lit mais imprime simplement "# {ConfigureAnnotation.doLogging}" et non la valeur "true" que j'ai définie dans le fichier xml. Pourriez-vous me montrer comment vous y parviendrez? – MWright

+0

Vous devez faire quelque chose avec la valeur assignée à l'annotation. Dans ce cas, la valeur est # {ConfigureAnnotation.doLogging} Vous devez donc soit instancier un résolveur EL à ressort pour résoudre la valeur, soit analyser la clé elle-même et donc quelque chose avec, comme System.getProperty (annotation .value(). substring (2, annotation.value(). size() -3) – lscoughlin