假设我有一个具有以下配置的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名称,并执行索引和对特定接口的转换。
我已经查看了这个帖子,希望能够从com.main.simulated中找出我的MainOne类是否可以排除当前实例化的MainOne类。但是,所选的答案指出,在编程上不可能启动或停止ejb。我也看过这个帖子,但是这更多的是关于我们如何在调用中注入这些bean的实用指南。
因此,我的问题是,我的后一个实现(com.main.simulated)能否以某种方式“替换”另一个bean,并确保永远不会执行com.main.notsimulated版本?
发布于 2016-11-25 13:07:01
显然不可能部署具有相同绑定的两个类。当尝试这样做时,就会得到绑定异常。然而,与我最初的研究相反,编程绑定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注释、@Startup注释和上下文的重新绑定。@Startup确保在容器加载类时调用@PostConstruct方法。当发生这种情况时,该方法将重新绑定一个值的类。因此,这是劫机地点。
希望这能帮上忙。
https://stackoverflow.com/questions/40768711
复制相似问题