java-ee-6 - 运行时 EJB 查找的配置

标签 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. 使用 ejb-jar.xml 代替注释 ( check here )
  2. 在代码中使用 InitialContext 查找 bean 并将 bean 名称移动到属性文件
  3. 在单独的 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/

相关文章:

ejb-3.1 - 使用 Arquillian 运行多个测试时尝试注入(inject)远程 ejb-ref 时出现异常

javax.naming.NameNotFoundException : Name "ilog.rules.res.session.impl.ejb3.IlrStatelessSessionLocal" not found in context "ejblocal:"

java - Glassfish v3 突然阻塞并耗尽最大线程数

jakarta-ee - 如何使用保留请求正文和响应正文的 servlet 过滤器记录请求和响应?

JavaEE 6 应用程序 (Glassfish v3) 中的性能 - 日志记录、DI、数据库操作、EJB、托管 Bean

java - jetty 8 + EJB 3.1 + JTA + CDI + JPA 2 堆栈?

comparison - EJB 3.1 或 Spring 3.. 什么时候选择哪一个?

java - Log4j 异步附加器的使用?

Java MDB - 如何跟踪已处理的消息数量

java - 在多个服务器上查找相同的 EJB