EJB优先级高于相同的绑定名称

时间:2016-11-23 15:46:50

标签: java java-ee

假设我有一个具有以下配置的EJB:

package com.main.notsimulated

@Singleton
@EJB(name = "java:/sample/MainOne", beanInterface = MainOne.class)
public class MainOne {}

此ejb需要存在才能使其他部署工作。但是,在测试环境中使用这个MainOne模块对我来说并不是很可行。相反,我宁愿在运行时注入我自己的自定义版本。

package com.main.simulated

@Singleton
@EJB(name = "java:/sample/MainOne", beanInterface = MainOne.class)
public class MainOne {}

(注意,这些是两个不同的jar文件)

因此,我的想法是,让我们尝试在运行时用自定义版本替换当前部署的版本。我想这样做的原因是因为我根本不想改变非模仿版本,也不想以任何方式影响ejb的使用者。即,消费者目前所做的一切都是寻找特定的jndi名称,并对特定界面执行异议和转换。

我已经查看了这个post,希望弄清楚com.main.simulated中的MainOne类是否可以驱逐当前实例化的MainOne类。但是,所选答案表明不能以编程方式启动或停止ejb。我也看过这个post,但这更像是一个实用的指南,关于我们如何在调用中注入这些bean。

因此,我的问题是,我的后一种实现(com.main.simulated)可以某种方式"替换"另一个bean,并确保从不执行com.main.notsimulated版本?

1 个答案:

答案 0 :(得分:0)

使用相同的绑定部署两个类显然是不可能的。尝试这样做时,会得到一个绑定异常。然而,与我原来的研究相反,以编程方式绑定bean是完全可能的。因此,关于如何“劫持”旧绑定并将其替换为新绑定的解决方案如下:(注意,用您需要的类替换类名)

package com.main.simulated

@Startup
@Singleton
public class MainOne {

    @PostConstruct
    private void rebindClass() throws NamingException {
        final Context context = new InitialContext();
        context.rebind("java:/sample/MainOne", this);
    }

    // other methods that will be called

}

这个类的三个重要内容是:删除@EJB注释,@ Start注释和上下文重新绑定。 @Startup确保在我们的容器加载我们的类时调用@PostConstruct方法。发生这种情况时,该方法会为类重新绑定值。因此,这是劫持地点。

希望这有助于某人。