java – 我应该使用哪个InitialContextFactory?
作者:互联网
我正在使用OpenEJB(TomEE)开发EJB 3项目.
我有一个无状态会话bean,其名称已使用注释指定.
@Stateless(mappedName="SlideService", name="SlideService")
public class SlideService {
public Map<Category, List<SlideShow>> fetchSlideShowsByCategory() {
Application app = Application.getInstance();
return app.retreiveAllSlideShowsByCategory();
}
public SlideShow fetchSlideShow(long id) {
return null;
}
public List<SlideShow> fetchSlideShowsByTitle(String title) {
return null;
}
}
我从我的Struts动作类中查找Session bean,就像这样.
Properties properties = new Properties();
properties.setProperty Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory");
InitialContext initialContext = new InitialContext(properties);
SlideService slideService = (SlideService)initialContext.lookup("SlideServiceLocalBean");
在上面的代码中,您将注意到我必须使用名称“SlideServiceLocalBean”来定位bean,而我已经在bean的注释中明确指定了“SlideService”.
但是,当我尝试在我的测试用例中找到bean时,我必须使用另一个名称字符串.
EJBContainer ejbContainer = EJBContainer.createEJBContainer();
Object oSlideService = ejbContainer.getContext().lookup("java:global/slides/SlideService");
为什么查找名称存在差异?
我是否以正确的方式在Struts动作类中获取InitialContext,还是应该使用其他机制/ contextFactory来获取初始上下文?
是否可以在不使用外部DI库的情况下将bean注入动作类?
解决方法:
在struts动作类中尝试这个:
new InitialContext().lookup("java:global/slides/SlideService");
它应该工作正常.所以这应该来自action类:
new InitialContext().lookup("java:module/SlideService");
使用LocalInitialContextFactory的查找早于JavaEE 6 Global JNDI,其中java:global和java:模块名称来自.
本文档解释了它的工作原理.
> http://openejb.apache.org/jndi-names.html
您的bean的名称是SlideService,并且具有所谓的@LocalBean视图(单个bean可以有许多视图,例如@LocalBean,@ Remote,@ Local),因此将SlideService作为@LocalBean查找的名称最终为SlideServiceLocalBean
这只是默认格式.您可以在conf / system.properties文件中将其更改为您喜欢的任何内容.
标签:java,ejb,openejb,apache-tomee 来源: https://codeday.me/bug/20190704/1376473.html