java - 使用限定符注释的多个数据源总是返回错误的数据源

标签 java datasource cdi wildfly

我正在使用老式数据源 Activity - 根本不涉及 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)来利用它:

@Inject @ConnectionPool(DS2)
private JdbcApdapterProvider jdbcAdapterProvider;

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

我在这里做错了什么?

最佳答案

看起来您在 @Resource 注释中混淆了 namelookup:

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

根据 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得到的。

关于java - 使用限定符注释的多个数据源总是返回错误的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35849989/

相关文章:

hibernate - org.jboss.weld.exceptions.IllegalArgumentException : WELD-001456: Argument resolvedBean must not be null

java - 如何使用 Weld 轻松注入(inject)字符串常量?

Java - 从动态 XML 中删除子节点

python - 将文本格式的数据读入 Python Pandas 数据框

java - 维护 Camel Route 内的数据库连接

spring 找不到 JNDI 数据源

java - 构造函数注入(inject)在 Servlet + WELD + Tomcat 中不起作用

java - LibreOffice Java 包设置vendorData

java - 有没有办法动态改变Java中if语句中的条件?

java - 如何在 Spring Boot 1.4 中的 http 请求的排序参数上设置 IgnoreCase