使用限定符注释的多个数据源始终返回错误的数据源

时间:2016-03-07 17:21:43

标签: java datasource cdi wildfly

我正在使用旧式数据源活动 - 根本不涉及JPA。所以没有persistence.xmlEntityManager

我有一个CDI制作人,如下:

@Dependent
public class JdbcAdapterProviderProducer {

  @Resource(name = "jboss/datasources/DS1")
  @ConnectionPool(DS1)
  private DataSource ds1DataSource;

  @Resource(name = "jboss/datasources/DS2")
  @ConnectionPool(DS2)
  private DataSource ds2DataSource;

  @Produces @ConnectionPool(DS1)
  public JdbcAdapterProvider getDs1JdbcAdapterProvider() {
    return new JdbcAdapterProvider(ds1DataSource);
  }

  @Produces @ConnectionPool(DS2)
  public JdbcAdapterProvider getDs2JdbcAdapterProvider() {
    return new JdbcAdapterProvider(ds2DataSource);
  }
}

然后我通过像这样注入来利用它:

@Inject @ConnectionPool(DS2)
private JdbcApdapterProvider jdbcAdapterProvider;

问题是被注入的数据源不是我试图访问的数据源。具体来说,它始终是jboss/datasources/ExampleDS数据源。

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

您的@Resource注释看起来好像与name vs lookup混淆:

name:定义资源引用的名称,使其可用(此作为“目标”) 查找:定义将资源引用插入的内容(将其视为“来源”)

根据Java EE 7规范,没有查找的DataSource将为您提供“java:comp / DefaultDataSource”,因此当您定义注释时:

@Resource(name = "jboss/datasources/DS2")
@ConnectionPool(DS2)
private DataSource ds2DataSource;

这被解释为:

@Resource(name = "jboss/datasources/DS2", lookup = "java:comp/DefaultDataSource")
@ConnectionPool(DS2)
private DataSource ds2DataSource;

这解释了为什么要回到jboss/datasources/ExampleDS,因为该数据源可能是您从java:comp/DefaultDataSource看到的。