我有使用JNDI的代码。代码片段如下:
EntityManager createEM(String JNDI ){
EntityManager em = null;
try{
InitialContext ic = new InitialContext();
em = (EntityManager) ic.lookup(JNDI);
return em;
}
catch (Exception ex){
LOG.Error("error in creating em");
ex.printStackTrace();
}
}
现在我收到错误。控件进入catch块。
javax.naming.NameNotFoundException: Name comp/env/persistence not found in context "java:".
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at com.ibm.ws.naming.ipbase.NameSpace.getParentCtxInternal(NameSpace.java:1837)
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at com.ibm.ws.naming.ipbase.NameSpace.lookupInternal(NameSpace.java:1166)
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at com.ibm.ws.naming.ipbase.NameSpace.lookup(NameSpace.java:1095)
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at com.ibm.ws.naming.urlbase.UrlContextImpl.lookup(UrlContextImpl.java:1233)
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at com.ibm.ws.naming.java.javaURLContextImpl.lookup(javaURLContextImpl.java:394)
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:214)
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at com.ibm.ws.naming.java.javaURLContextRoot.lookup(javaURLContextRoot.java:154)
[12/28/10 15:51:07:086 GMT+05:30] 00000081 SystemErr R at javax.naming.InitialContext.lookup(Unknown Source)
我有2个项目说A和B.Now项目B有上面的方法,从项目A我从项目中调用mehod B.persistent.xml只在项目A中存在。我需要将persistent.xml放在项目A也是?我也将下面的内容作为例外的一部分
javax.naming.NameNotFoundException: Name comp/env/persistence not found in context "java:".
可能是什么原因。使用websphere。
答案 0 :(得分:2)
您对问题的描述有点草率:
persistent.xml仅在项目A中存在。我是否也需要在项目A中放置persistent.xml?
我认为: persistence.xml仅存在于项目B中。我是否还需要在项目A中放置persistence.xml?
设置到底是什么?这两个项目是否都部署在同一台服务器上他们在不同的服务器上?项目A是否正在访问项目B的远程会话bean?我们在谈论什么项目? Web项目,EJB项目?其中包含Web和EJB项目的EAR项目?
我认为您不支持将实体管理器从一个应用程序发送到另一个应用程序。这个想法是客户端调用远程bean,然后这个远程bean获得一个本地实体管理器,做一些工作并返回结果。如果A是您的客户,那么肯定不需要一个本地persistence.xml。
您的问题很可能是您所追求的实体经理根据您认为的名称而无法使用。 java:comp/env/persistence
显然不存在。通常,实体管理器不会自动出现在JNDI中。如果B是一个servlet,你需要这样的东西:
<persistence-context-ref>
<persistence-context-ref-name>persistence</persistence-context-ref-name>
<persistence-unit-name>yourpu</persistence-unit-name>
</persistence-context-ref>
如果B是EJB会话bean,则需要以下内容:
@Stateless
@PersistenceUnit(name="persistence", unitName="yourpu")
public class BBean implements BRemoteInterface {
// some code here...
}
在此之后,当从该servlet或bean启动JNDI查找时,实体管理器将在java:comp/env/persistence
下可用,但仅。 java:comp / env是一个相对上下文,对于在其上进行查找的每个位置都是不同的。
您可以做的最少的事情就是从B打印java:comp/env
上下文并查看其中的内容。请参阅此简单示例如何进行此类打印:http://tripoverit.blogspot.com/2007/03/print-jndi-tree.html
答案 1 :(得分:0)
您是否在websphere配置中定义了名为persistence的连接?
错误是说你没有定义任何命名的'persistence'
答案 2 :(得分:0)
您可以调试在websphere上运行的应用程序吗?有可能这样做。我建议您在调试模式下运行应用程序并在jndi查找点处断点,然后您可以查询jndi上下文的状态。