假设我有一个具有以下配置的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版本?
答案 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方法。发生这种情况时,该方法会为类重新绑定值。因此,这是劫持地点。
希望这有助于某人。