【问题标题】:Enum's String property used for Annotation用于注解的枚举字符串属性
【发布时间】:2011-02-11 08:44:24
【问题描述】:

我想重用我已经必须为需要 String 编译时间常量的 @Resource 注释指定参数的安全枚举。 我还没有找到任何优雅的解决方案如何重用 DATASOURCE,除了我附上的:

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 常量以及 @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;

  ... 
}

有什么想法吗?

【问题讨论】:

  • 没什么大不了的,你现在的解决方案没有问题。

标签: java annotations ejb


【解决方案1】:

您的解决方案很好。

【讨论】:

  • 很遗憾,奇迹没有发生 :-( 在我们的应用程序中,我们确实有多个数据源,并且将数据源名称直接以文字形式写入代码很容易出错。
  • 我知道你的感受。当我第一次发现它时,我也对此感到惊讶(对常数的要求,而不是奇迹:-))。
  • 由于奇迹尚未发生,我认为您的回答是解决方案:-)
【解决方案2】:

不过,您可以简单地枚举一下:

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

【讨论】:

  • 即使您将 jndiReference 指定为 public final String jndiReference,如果您尝试在代码编译器中使用 @Resource(mappedName=DATASOURCE.Datasource1.jndiReference) 会报错:“注释属性 Resource.mappedName 的值必须是一个常量表达式”。请不要抹去你的答案(即使它解决了我担心的问题),因为这个确切的答案昨天就在这里。
猜你喜欢
  • 2015-04-14
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 2019-03-08
相关资源
最近更新 更多