我在 JBoss-AS-7.1 服务器上部署了多个作为 EJB 的服务。许多应用程序通过执行如下查找来使用这些 EJB:
@EJB(lookup = "java:global/FooService/FooBean!com.xyz.FooBeanRemote")
private FooBeanRemote fooBeanRemote;
问题在于查找字符串是硬编码在源代码中的。我希望能够在运行时更改此查找 - 无需重新编译 - 因为 FooService 可能会在未来某个时间更新,并且可能有不同的实现。此外,ejb 还可以移动到不同的服务器实例。
实现这一目标的最佳方法是什么?
最佳答案
- 使用 ejb-jar.xml 代替注释 ( check here )
- 在代码中使用 InitialContext 查找 bean 并将 bean 名称移动到属性文件
- 在单独的 jar 中实现 CDI 生成器方法
--编辑--- 关于最后一点的快速指南:
<强>1。创建限定符
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface FooService {
}
<强>2。创建生产者方法
public class EJBProducer {
@Produces
@FooService
@EJB(lookup = "java:global/FooService/FooBean!com.xyz.FooBeanRemote")
private FooBeanRemote fooBeanRemote;
}
<强>3。在您的代码中使用
@Inject @FooService
private FooBeanRemote fooBeanRemote;
前两个点可能位于另一个 jar 存档中(请记住包含 META-INF/beans.xml 文件)。您还可以使用生产者方法而不是字段,并以编程方式访问 ejb。
关于java-ee-6 - 运行时 EJB 查找的配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19107613/