我正在开发一个带有OpenEJB(TomEE++)容器的EJB项目。有一个会话 Bean,其 JNDI 查找名称需要在代码中控制。
@Stateless(mappedName="SlideService", name="SlideService")
public class SlideService {
public Map<Category, List<SlideShow>> fetchSlideShowsBycategory() {
// TODO Auto-generated method stub
return null;
}
public SlideShow fetchSlideShow(long id) {
// TODO Auto-generated method stub
return null;
}
public List<SlideShow> fetchSlideShowsByTitle(String title) {
// TODO Auto-generated method stub
return null;
}
}
我的问题是,这个bean绑定到的名称是"global/slides/SlideService"
OpenEJB似乎正在使用应用程序名称,即使我没有特别提到它。
这会损害便携性吗?是否有可能其他容器可能不使用应用程序名称?
使用 name 和 mappedName 属性是控制无状态 Bean 名称的正确方法,还是有其他(更好的)方法?
您的问题已在 EJB 3.1 规范中得到解决,任何 Java EE 6 认证的容器都将为您的 bean 使用多个 JNDI 名称。在您的代码中,您可以控制名称的最后一部分,这里是关于可移植全局 JNDI 名称的文档
在这里,您可以找到 EJB 3.1 中 JNDI 可移植 JNDI 名称的 3 个标准作用域的简单指南
。所以是的,您的代码可以在任何Java EE 6认证的容器中移植。