2011-02-10 5 views
4

String型のコンパイル時定数を必要とする@Resourceアノテーションの引数を指定する必要があるsafetype enumを再利用したいと思います。私はどのように私は囲み、この以外のデータソースを再利用するために、任意のエレガントな解決策が見つからないてい :AnnotationにEnumのStringプロパティを使用

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); 
    } 
    } 
} 

列挙型の使い方自体

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()); 
    } 
} 

をしかし、今、私はSessionBeansでも同じDATASOURCE定数を使用したいです@リソースアノテーションと一緒に

@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; 

    ... 
} 

ご存知ですか?

+0

それはあなたが今持っているソリューションと間違って何もない、大したことではありません。 – irreputable

答えて

0

解決策はそのままです。

+0

私たちのアプリケーションでは、実際には複数のデータソースがあり、コードにリテラルとして書かれたデータソース名を使用するとかなりエラーが発生します。 –

+0

私はあなたの気持ちを知っています。定数の要件ではなく、奇跡:-))私が最初にそれを発見したときにも。 –

+0

奇跡はまだ起こっていないので、私はあなたの答えを解決策と考えています:-) –

0

することはでき単に少しかかわらず、あなたの列挙型:

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

jndiReferenceをpublic final String jndiReferenceとして指定しても、コードコンパイラで@Resource(mappedName = DATASOURCE.Datasource1.jndiReference) : "注釈属性Resource.mappedNameの値は定数式でなければなりません"。この正確な答えが昨日ここにあったので、あなたの答えを消さないでください(私が恐れている問題を解決しても)。 –

関連する問題