Java 枚举';用于注释的字符串属性

Java 枚举';用于注释的字符串属性,java,annotations,ejb,Java,Annotations,Ejb,我想重用safetype枚举,我已经为@Resource注释指定了参数,该注释需要字符串编译时常量。 除了我随函附上的以下内容外,我还没有找到任何关于如何重用数据源的优雅解决方案: public enum DATASOURCE { // Enum constants DataSource1, DataSource2; public final static String DataSource1_jndi = "java:/jdbc/DataSource1"; public fi

我想重用safetype枚举,我已经为@Resource注释指定了参数,该注释需要字符串编译时常量。 除了我随函附上的以下内容外,我还没有找到任何关于如何重用数据源的优雅解决方案:

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中与@Resource注释一起使用相同的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;

  ... 
}

有什么想法吗?

您的解决方案就这么好。

不过您可以简单地使用枚举:

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

这没什么大不了的,您现在的解决方案没有什么问题。奇迹没有发生是一件微不足道的事:-(在我们的应用程序中,我们确实有多个数据源,使用数据源名称直接以文本形式写入代码非常容易出错。我知道您的感受。我对此感到惊讶(当我第一次发现它时,对常量的要求,而不是奇迹:——),因为奇迹还没有发生,我认为你的答案是:-)即使你指定JNDIVAL作为公共最终字符串JNDIGRID,那么在你尝试使用@资源(MaPDDNNe= DATABORCE.DATABORCE1.1.JNDICORE)的情况下在代码中,编译器抱怨:“注释属性Resource.mappedName的值必须是常量表达式”。请不要删除你的答案(即使它解决了我担心的问题),因为这个确切的答案昨天就在这里。