首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EJB优先级在同一绑定名称上

EJB优先级在同一绑定名称上
EN

Stack Overflow用户
提问于 2016-11-23 15:46:50
回答 1查看 261关注 0票数 0

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

代码语言:javascript
复制
package com.main.notsimulated

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

这个ejb需要有其他的部署才能工作。然而,在测试环境中,使用这个MainOne护城河对我来说并不是很有效。相反,我宁愿在运行时注入我自己的自定义版本。

代码语言:javascript
复制
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版本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-25 13:07:01

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

代码语言:javascript
复制
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方法。当发生这种情况时,该方法将重新绑定一个值的类。因此,这是劫机地点。

希望这能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40768711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档