2011-02-10 2 views
4

Je voudrais réutiliser safetype enum dont j'ai déjà spécifié l'argument pour l'annotation @Resource qui nécessite une constante de temps de compilation String. Je n'ai trouvé aucune solution élégante façon de réutiliser DATASOURCE sauf ce que je joins:La propriété String d'Enum utilisée pour l'annotation

public enum DATASOURCE { 
    // Enum constants 
    DataSource1, DataSource2; 

    public final static String DataSource1_jndi = "java:/jdbc/DataSource1"; 
    public final static String DataSource2_jndi = "java:/jdbc/DataSource2"; 

    public String getJndiName() { 
    switch(this) { 
     case DataSource1: 
     return DataSource1_jndi; 
     case DataSource2: 
     return DataSource2_jndi; 
     default: 
     throw new RuntimeException("Not defined jndi name for DATASOURCE " + this); 
    } 
    } 
} 

Utilisation de ENUM se

public class DataSourceFactory { 

    /** 
    * @param ds Identifier of datasource 
    */ 
    public static DataSource getDataSource(DATASOURCE ds) { 
    // maybe some caching for datasource identified by constant 
    ... 
    return (DataSource) new InitialContext().lookup(ds.getJndiName()); 
    } 
} 

Mais maintenant, je voudrais utiliser la même constante DATASOURCE aussi dans SessionBeans avec l'annotation @Resource

@Stateless 
public class SomeSessionBean { 
    // This is what I would love to use but 
    // annotation wants compile time constant :-(
    // @Resource(mappedName=DATASOURCE.DataSource1.getJndiName()); 
    @Resource(mappedName=DATASOURCE.DataSource1_jndi); 
    DataSource ds; 

    ... 
} 

Une idée?

+0

Ce n'est pas une grosse affaire, il n'y a rien de mal à la solution que vous avez maintenant. – irreputable

Répondre

0

Votre solution est correcte telle qu'elle est.

+0

Il est dommage que les miracles ne se produisent pas :-( Dans notre application, nous avons vraiment plusieurs sources de données et en utilisant le nom de la source de données directement écrit comme littéral dans le code est très sujet aux erreurs –

+0

Je sais ce que vous ressentez. exigence pour une constante, pas les miracles :-)) aussi bien quand je l'ai découvert la première fois. –

+0

Comme miracle n'est pas déjà arrivé, je considère votre réponse comme solution :-) –

0

Vous pouvez simplement votre ENUM un peu si:

public enum DATASOURCE { 
Datasource1("java:/jdbc/DataSource1"), Datasource2("java:/jdbc/DataSource2"); 
private String jndiReference; 

private DATASOURCE(String jndiReference) { 
    this.jndiReference = jndiReference; 
} 

public String getJndiName() { 
    return this.jndiReference; 
} 
} 
+0

Même si vous spécifiez jndiReference comme public final String jndiReference alors au cas où vous essayez d'utiliser @Resource (mappedName = DATASOURCE.Datasource1.jndiReference) dans le compilateur de code se plaint : "La valeur de l'attribut d'annotation Resource.mappedName doit être une expression constante". S'il vous plaît ne pas effacer votre réponse (même si cela résout le problème, j'ai peur) parce que cette réponse exacte était ici hier. –

Questions connexes