local bean 的jndi找不到

dash_running 2007-06-12 05:26:49
小弟学ejb,搞了个session bean --NewsBean, 和entity bean --ArticleBean,
ArticleBean是local的,NewsBean 调用Article的方法来得到文章内容

调用代码是这样的:
Context ctx = new InitialContext();
Object obj = (Context)ctx.lookup("java:comp/env/ArticleLocal ");

可是每次都是执行到ctx.lookup这里报错,说ArticleLocal没绑定


错误是这样的:
16:34:56,373 ERROR [STDERR] javax.naming.NameNotFoundException: ArticleLocal not bound



可是我查看jndi view 却已经有了:

Global JNDI Namespace

+- TopicConnectionFactory (class: org.jboss.naming.LinkRefPair)
+- jmx (class: org.jnp.interfaces.NamingContext)
| +- invoker (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor (proxy: $Proxy42 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RMIAdaptorExt)
| +- rmi (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
+- HTTPXAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- ArticleLocal (proxy: $Proxy98 implements interface cmp.ArticleLocalHome) //******这里已经有了ArticleLocal
+- UserTransactionSessionFactory (proxy: $Proxy12 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
+- HTTPConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
+- UILXAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- UIL2XAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- queue (class: org.jnp.interfaces.NamingContext)
| +- A (class: org.jboss.mq.SpyQueue)
| +- testQueue (class: org.jboss.mq.SpyQueue)
| +- ex (class: org.jboss.mq.SpyQueue)
| +- DLQ (class: org.jboss.mq.SpyQueue)
| +- D (class: org.jboss.mq.SpyQueue)
| +- C (class: org.jboss.mq.SpyQueue)
| +- B (class: org.jboss.mq.SpyQueue)
+- topic (class: org.jnp.interfaces.NamingContext)
| +- testDurableTopic (class: org.jboss.mq.SpyTopic)
| +- testTopic (class: org.jboss.mq.SpyTopic)
| +- securedTopic (class: org.jboss.mq.SpyTopic)
+- console (class: org.jnp.interfaces.NamingContext)
| +- PluginManager (proxy: $Proxy43 implements interface org.jboss.console.manager.PluginManagerMBean)
+- UIL2ConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
+- HiLoKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.hilo.HiLoKeyGeneratorFactory)
+- UILConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
+- ejb (class: org.jnp.interfaces.NamingContext)
| +- News (proxy: $Proxy100 implements interface news.interfaces.NewsHome,interface javax.ejb.Handle)
+- QueueConnectionFactory (class: org.jboss.naming.LinkRefPair)
+- UUIDKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.uuid.UUIDKeyGeneratorFactory)

1.我lookup ArticleLocal是在NewsBean里lookup的,不是在客户端
2.用的是jboss4
3.ArticleBean只是local,不是remote and local的

搞了一下午了,没办法,请高人指教,接分!



以下是jndi view 的内容,不太看的懂,贴出来请帮我看看ArticleLocal 到底帮定好没有 ,谢谢了!

Ejb Module: NewsEJB.jar

java:comp namespace of the Article bean:

+- env (class: org.jnp.interfaces.NamingContext)


java:comp namespace of the News bean:

+- env (class: org.jnp.interfaces.NamingContext)


java: Namespace

+- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- DefaultDS (class: javax.sql.DataSource)
+- SecurityProxyFactory (class: org.jboss.security.SubjectSecurityProxyFactory)
+- DefaultJMSProvider (class: org.jboss.jms.jndi.JNDIProviderAdapter)
+- MySqlDS (class: javax.sql.DataSource)
+- comp (class: javax.naming.Context)
+- JmsXA (class: org.jboss.resource.adapter.jms.JmsConnectionFactoryImpl)
+- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- jaas (class: javax.naming.Context)
| +- HsqlDbRealm (class: org.jboss.security.plugins.SecurityDomainContext)
| +- jbossmq (class: org.jboss.security.plugins.SecurityDomainContext)
| +- JmsXARealm (class: org.jboss.security.plugins.SecurityDomainContext)
+- timedCacheFactory (class: javax.naming.Context)
Failed to lookup: timedCacheFactory, errmsg=org.jboss.util.TimedCachePolicy
+- TransactionPropagationContextExporter (class: org.jboss.tm.TransactionPropagationContextFactory)
+- StdJMSPool (class: org.jboss.jms.asf.StdServerSessionPoolFactory)
+- Mail (class: javax.mail.Session)
+- TransactionPropagationContextImporter (class: org.jboss.tm.TransactionPropagationContextImporter)
+- TransactionManager (class: org.jboss.tm.TxManager)


Global JNDI Namespace

+- TopicConnectionFactory (class: org.jboss.naming.LinkRefPair)
+- jmx (class: org.jnp.interfaces.NamingContext)
| +- invoker (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor (proxy: $Proxy42 implements interface org.jboss.jmx.adaptor.rmi.RMIAdaptor,interface org.jboss.jmx.adaptor.rmi.RMIAdaptorExt)
| +- rmi (class: org.jnp.interfaces.NamingContext)
| | +- RMIAdaptor[link -> jmx/invoker/RMIAdaptor] (class: javax.naming.LinkRef)
+- HTTPXAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- ConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- ArticleLocal (proxy: $Proxy98 implements interface cmp.ArticleLocalHome)
+- UserTransactionSessionFactory (proxy: $Proxy12 implements interface org.jboss.tm.usertx.interfaces.UserTransactionSessionFactory)
+- HTTPConnectionFactory (class: org.jboss.mq.SpyConnectionFactory)
+- XAConnectionFactory (class: org.jboss.mq.SpyXAConnectionFactory)
+- UserTransaction (class: org.jboss.tm.usertx.client.ClientUserTransaction)
+- UILXAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- UIL2XAConnectionFactory[link -> XAConnectionFactory] (class: javax.naming.LinkRef)
+- queue (class: org.jnp.interfaces.NamingContext)
| +- A (class: org.jboss.mq.SpyQueue)
| +- testQueue (class: org.jboss.mq.SpyQueue)
| +- ex (class: org.jboss.mq.SpyQueue)
| +- DLQ (class: org.jboss.mq.SpyQueue)
| +- D (class: org.jboss.mq.SpyQueue)
| +- C (class: org.jboss.mq.SpyQueue)
| +- B (class: org.jboss.mq.SpyQueue)
+- topic (class: org.jnp.interfaces.NamingContext)
| +- testDurableTopic (class: org.jboss.mq.SpyTopic)
| +- testTopic (class: org.jboss.mq.SpyTopic)
| +- securedTopic (class: org.jboss.mq.SpyTopic)
+- console (class: org.jnp.interfaces.NamingContext)
| +- PluginManager (proxy: $Proxy43 implements interface org.jboss.console.manager.PluginManagerMBean)
+- UIL2ConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
+- HiLoKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.hilo.HiLoKeyGeneratorFactory)
+- UILConnectionFactory[link -> ConnectionFactory] (class: javax.naming.LinkRef)
+- ejb (class: org.jnp.interfaces.NamingContext)
| +- News (proxy: $Proxy100 implements interface news.interfaces.NewsHome,interface javax.ejb.Handle)
+- QueueConnectionFactory (class: org.jboss.naming.LinkRefPair)
+- UUIDKeyGeneratorFactory (class: org.jboss.ejb.plugins.keygenerator.uuid.UUIDKeyGeneratorFactory)
...全文
469 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
age_x1 2007-08-15
  • 打赏
  • 举报
回复
自己搞定
zl_inter 2007-06-13
  • 打赏
  • 举报
回复
正解来了:
在上下文环境中,是通过JNDI来对资源定位的。每个资源(EJB,DateSource,Factory,Queen)等都应该给定一个固定的JNDI,就是通常的ejb/***,jms/***等。但是有时在嵌套访问时,比如在一个SessionBean里面初始化一个JMS,可以给JMS给定一个只作用在SessionBean内的JNDI引用,就是常说的Reference。
javax.naming.NameNotFoundException通常就是JNDI或者JNDI-Reference没有给定。

ctx.lookup("java:comp/env/ArticleLocal ")中java:comp/env/是引用的名空间,说明是通过JNDI-Reference来定位;也可以直接用JNDI定位,ctx.lookup("ejb/***")。
likgui 2007-06-13
  • 打赏
  • 举报
回复
关注
dash_running 2007-06-12
  • 打赏
  • 举报
回复
好在我已经搞定了,原来是我的部署描述没写好,local bean 通过ejb-local-ref来调用
ejb-jar.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">

<ejb-jar >

<description><![CDATA[No Description.]]></description>
<display-name>Generated by XDoclet</display-name>

<enterprise-beans>

<!-- Session Beans -->
<session >
<description><![CDATA[Description for News]]></description>
<display-name>Name for News</display-name>

<ejb-name>News</ejb-name>

<home>news.interfaces.NewsHome</home>
<remote>news.interfaces.News</remote>
<ejb-class>news.ejb.NewsBean</ejb-class>
<session-type>Stateful</session-type>
<transaction-type>Container</transaction-type>
<ejb-local-ref>
<ejb-ref-name>ejb/Editor</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>news.interfaces.EditorLocalHome</local-home>
<local>news.interfaces.EditorLocal</local>
<ejb-link>Editor</ejb-link>
</ejb-local-ref>
<ejb-local-ref>
<ejb-ref-name>ejb/Article</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>cmp.ArticleLocalHome</local-home>
<local>cmp.ArticleLocal</local>
<ejb-link>Article</ejb-link>
</ejb-local-ref>

</session>

<session >
<description><![CDATA[Description for Editor]]></description>
<display-name>Name for Editor</display-name>

<ejb-name>Editor</ejb-name>
<ejb-class>news.ejb.EditorBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
<local-home>news.interfaces.EditorLocalHome</local-home>
<local>news.interfaces.EditorLocal</local>



</session>

<!--
To add session beans that you have deployment descriptor info for, add
a file to your XDoclet merge directory called session-beans.xml that contains
the <session></session> markup for those beans.
-->

<!-- Entity Beans -->
<entity >
<description><![CDATA[Description for Article]]></description>
<display-name>Name for Article</display-name>

<ejb-name>Article</ejb-name>

<local-home>cmp.ArticleLocalHome</local-home>
<local>cmp.ArticleLocal</local>

<ejb-class>cmp.ArticleBean</ejb-class>
<persistence-type>Container</persistence-type>
<prim-key-class>cmp.ArticlePK</prim-key-class>
<reentrant>False</reentrant>
<cmp-version>2.x</cmp-version>
<abstract-schema-name>Article</abstract-schema-name>
<cmp-field >
<description><![CDATA[Getter for CMP Field id]]></description>
<field-name>id</field-name>
</cmp-field>
<cmp-field >
<description><![CDATA[Getter for CMP Field content]]></description>
<field-name>content</field-name>
</cmp-field>

<!-- Write a file named ejb-finders-ArticleBean.xml if you want to define extra finders. -->

</entity>

</enterprise-beans>

<assembly-descriptor >


</assembly-descriptor>

</ejb-jar>

jboss.xml:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 4.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_4_0.dtd">

<jboss>

<enterprise-beans>

<entity>
<ejb-name>Article</ejb-name>
<local-jndi-name>ArticleLocal</local-jndi-name>

<method-attributes>
</method-attributes>

</entity>

<session>
<ejb-name>News</ejb-name>
<jndi-name>ejb/News</jndi-name>
<ejb-local-ref>
<ejb-ref-name>ejb/Editor</ejb-ref-name>
<jndi-name>EditorHomeLocal</jndi-name>
</ejb-local-ref>
<ejb-local-ref>
<ejb-ref-name>ejb/Article</ejb-ref-name>
<jndi-name>ArticleHomeLocal</jndi-name>
</ejb-local-ref>

<method-attributes>
</method-attributes>
</session>


</enterprise-beans>

<assembly-descriptor>
</assembly-descriptor>

<resource-managers>
</resource-managers>


</jboss>

NewsBean里用

Context ctx = new InitialContext();
ArticleLocalHome home = (ArticleLocalHome)ctx.lookup("java:comp/env/ejb/Article");
就可以得到ArticleLocalHome了


还有什么别的方法能行吗???一起讨论,来者有分!



dash_running 2007-06-12
  • 打赏
  • 举报
回复
楼上,你说的是在客户端掉用的时候要加,我的问题是在session bean 里调用另外一个local bean
就算你说的这种方法能行的通,也不是local bean的正宗做法啊
Kelven_hou 2007-06-12
  • 打赏
  • 举报
回复
很简单,没有提供JNDI的运行环境.在你的运行代码里加入以下代码
Properties props = new Properties();
props.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
props.setProperty("java.naming.provider.url","localhost:1099");
props.setProperty("java.naming.factory.url.pkgs","org.jboss.naming");
dash_running 2007-06-12
  • 打赏
  • 举报
回复
补充 部署时console的提示信息是

16:52:27,915 INFO [EjbModule] Deploying Article
16:52:27,935 INFO [EjbModule] Deploying News
16:52:28,276 INFO [BaseLocalProxyFactory] Bound EJB LocalHome 'Article' to jndi 'ArticleLocal'
16:52:28,306 INFO [ProxyFactory] Bound EJB Home 'News' to jndi 'ejb/News'

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧