在运行时配置EJB查找

时间:2013-10-01 03:47:30

标签: java-ee-6 ejb-3.1

我在JBoss-AS-7.1服务器上部署了几个作为EJB的服务。许多应用程序通过执行以下查找来使用这些EJB:

@EJB(lookup = "java:global/FooService/FooBean!com.xyz.FooBeanRemote")
private FooBeanRemote fooBeanRemote;

问题是查找字符串在源代码中是硬编码的。我希望能够在运行时更改此查找 - 无需重新编译 - 因为FooService可能会在将来的某个时间更新,并且可能具有不同的实现。此外,ejb还可以移动到不同的服务器实例。

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

  1. 使用ejb-jar.xml而不是注释(check here
  2. 在代码中使用InitialContext来查找bean并将bean名称移动到属性文件
  3. 在单独的jar
  4. 中实现CDI生产者方法

    - 编辑--- 关于最后一点的快速HOWTO:

    <强> 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文件)。您也可以使用producer方法而不是field,并以编程方式访问ejb。