【问题标题】:Using java annotation with dynamic parameter使用带有动态参数的 java 注解
【发布时间】:2016-01-11 09:38:13
【问题描述】:

我想要实现的是拥有一个带有动态name 参数的@Resource。具体来说,我想使用@Resource(name = "{JNDI_NAME_PARAM}") 注入一个DataSource 对象,因为我们可以在应用程序服务器中配置许多数据源,并且应用程序使用的数据源在.xml 或.config 文件中定义。由于我在编译期间不知道数据源的名称,因此我需要能够在运行时获取它。现在我正在注入一个自定义的@ApplicationScoped bean,它使用InitialContext().lookup() 在其@PostConstruct 方法中创建一个数据源。但是我很好奇(主要是因为它更优雅)如何使用@Resource 注释实现注入。

我可以在应用服务器中创建一个自定义的默认 JNDI 名称,并在需要时更改它指向的数据源,但这不能用于多个部署,而且很多时候我们部署了两次应用程序,一次在测试数据库中一次在生产数据库中,因此 JNDI 同时指向两个不同的数据源。

【问题讨论】:

  • 好吧,回答你标题中的“问题”:你绝对不能有一个在编译时不固定的注释值。但这并不意味着你使用的任何东西都没有非注解的方式来注入东西。

标签: java datasource cdi jndi


【解决方案1】:

您可以使用基于方法的注入。 它需要setter方法(setMyDB)。

public class Test {

  public javax.sql.DataSource myDB;

  @Resource(name="student")
  private void setMyDB(javax.sql.DataSource ds) {
      myDB = ds;
  }
}

如果名称已知,我们可以在下面有多个资源

@Resources({

 @Resource(your type)
 @Resource(your type)
})

【讨论】:

  • 我真的没明白。您的代码 sn-ps 是解决方案的一部分还是实现此目的的两种不同方法?此外,名称未知且未预定义。这不像我必须从 JNDI 名称列表中进行选择,而我不知道该选择哪一个。 JNDI 名称由我们负责在客户端服务器上安装应用程序的技术人员定义。他所做的是将.war 解包,将web.xml 上的<env-entry> 更改并重新打包。创建一个包装类也不是一个真正的解决方案,因为我已经实现了类似的东西。我什至可以使用@Produces 注释。
  • 他们是不同的方式。您可以尝试另一种方法,通过使用静态变量,将传递的值分配给此静态变量,并且可以在 @Resource(name=static_variable) 的位置使用此变量。
  • 我尝试了变量方法,但它必须是final 否则它不会编译
猜你喜欢
  • 1970-01-01
  • 2011-11-29
  • 1970-01-01
  • 2013-05-18
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
相关资源
最近更新 更多