2011-02-10 8 views
4

String 컴파일 시간 상수가 필요한 @Resource 주석에 대한 인수를 이미 지정해야하는 safetype enum을 다시 사용하고 싶습니다. 나는 어떻게 둘러싸는이를 제외하고 데이터 소스를 재사용 할 수있는 우아한 해결책을 발견하지 않았습니다 : 열거 자체Annotation에 Enum의 String 속성이 사용되었습니다.

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

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

사용을하지만 지금은 SessionBeans에 같은 데이터 소스 상수를 사용하고 싶습니다 @Resource annotation과 함께

@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의 값은 상수 표현이어야합니다". 이 정확한 답변이 어제 여기에 있었기 때문에 답을 지우지 마십시오 (심지어 두려운 것이 문제를 해결합니다). –

관련 문제