- - PR -
EJBのLookupについて
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2005-11-11 10:06
おつかれさまです。
EJBの勉強をしているのですが、StrutsのActionの中からEJBの呼び出しを 行うとNullポインターが発生して呼び出すことができません。 (クライアントからは実行可能です。) おバカな質問なのかも知れませんがご教授よろしくお願いいたします。 *********環境********* OS:WinXP Struts Tomcat5.5(localhost:8081) jboss-4.0.2(localhost:8080) JDK:1.5 Tomcat,Jboss共にローカルにインストールしています。 *********Web.xml********* <ejb-ref> <ejb-ref-name>SearchAddress</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>jp.co.main.business.SearchAddress.SearchAddressHome</home> <remote>jp.co.main.business.SearchAddress.SearchAddress</remote> </ejb-ref> *********サーブレット内でのEJB呼び出し********* InitialContext ctx = new InitialContext(); SearchAddressHome home = (SearchAddressHome)PortableRemoteObject.narrow( ctx.lookup("java:/comp/env/SearchAddress"), SearchAddressHome.class);@ SearchAddress searchAddress = home.create(); @のctx.lookup("java:/comp/env/SearchAddress")の結果でNullが返ってきます@u@; のctx.lookup("SearchAddress")もだめでした。 *********jndi.properties********* java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=jnp://localhost:1099 *********ejb-jar.xml********* <ejb-jar> <enterprise-beans> <session> <ejb-name>SearchAddress</ejb-name> <home>jp.co.main.business.SearchAddress.SearchAddressHome</home> <remote>jp.co.main.business.SearchAddress.SearchAddress</remote> <ejb-class>jp.co.main.business.SearchAddress.SearchAddressBean</ejb-class> <session-type>Stateless</session-type> <transaction-type>Container</transaction-type> </session> </enterprise-beans> </ejb-jar> *********jboss.xml********* <jboss> <enterprise-beans> <session> <ejb-name>SearchAddress</ejb-name> <jndi-name>SearchAddress</jndi-name> </session> </enterprise-beans> </jboss> *********実行可能なクライアントソース********* InitialContext ctx = new InitialContext(); SearchAddressHome home = (SearchAddressHome)PortableRemoteObject.narrow( ctx.lookup("SearchAddress"), SearchAddressHome.class); SearchAddress searchAddress = home.create(); | ||||
|
投稿日時: 2005-11-12 01:11
この定義だけではctx.lookup("java:/comp/env/SearchAddress")で 参照する先がどこなのか確定できていないからでは? <ejb-ref-name>はWAR側でどう見えるかの定義なので。 jboss-web.xml側で参照に対する物理名をマッピングするか、 <ejb-link>SearchAddress</ejb-link>とする必要がありそうです。 EJBがWARと同じEARの中にあるのなら後者の方がいいでしょう。 | ||||
|
投稿日時: 2005-11-15 16:30
あしゅさん
ご回答ありがとうございます。 返答が遅れて申し訳ございません(風邪で死んでいました) さてご回答どうりWeb.xmlにejb-linkを追加して実行してみたところ、 以下のエラーが発生して実行できません。(その他変更はしていません。) 他にも何か設定が必要なのでしょうか? (あしゅさんのご回答の内容を理解かもしれません・・) 構成としてはEJB(jarファイル)とWebモジュール(war)をearファイルに まとめてJBossにDeployしています。 よろしくお願いいたします。 *********Web.xml********* <ejb-ref> <ejb-ref-name>SearchAddress</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <home>jp.co.main.business.SearchAddress.SearchAddressHome</home> <remote>jp.co.main.business.SearchAddress.SearchAddress</remote> <ejb-link>SearchAddress</ejb-link> </ejb-ref> ****************** java.lang.LinkageError: loader constraints violated when linking javax/ejb/Handle class java.lang.Class.getDeclaredFields0(Native Method) java.lang.Class.privateGetDeclaredFields(Class.java:2232) java.lang.Class.getDeclaredField(Class.java:1852) java.io.ObjectStreamClass.getDeclaredSUID(ObjectStreamClass.java:1555) java.io.ObjectStreamClass.access$600(ObjectStreamClass.java:47) java.io.ObjectStreamClass$2.run(ObjectStreamClass.java:381) java.security.AccessController.doPrivileged(Native Method) java.io.ObjectStreamClass.<init>(ObjectStreamClass.java:373) java.io.ObjectStreamClass.lookup(ObjectStreamClass.java:268) java.io.ObjectStreamClass.initProxy(ObjectStreamClass.java:464) java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1502) java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1457) java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1693) java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299) java.io.ObjectInputStream.readObject(ObjectInputStream.java:339) java.rmi.MarshalledObject.get(MarshalledObject.java:135) org.jnp.interfaces.MarshalledValuePair.get(MarshalledValuePair.java:57) org.jnp.interfaces.NamingContext.lookup(NamingContext.java:637) org.jnp.interfaces.NamingContext.lookup(NamingContext.java:572) javax.naming.InitialContext.lookup(InitialContext.java:351) jp.co.main.ejb.EJBServiceLocator.execute(EJBServiceLocator.java:61) jp.co.main.business.SearchAddressEJB.SearchAddressEJBAction.ActionExecute(SearchAddressEJBAction.java:22) jp.co.main.util.CommonAction.execute(CommonAction.java:29) org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226) org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164) jp.co.main.util.CommonActionServlet.process(CommonActionServlet.java:18) org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) javax.servlet.http.HttpServlet.service(HttpServlet.java:810) org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:81) note The full stack trace of the root cause is available in the Apache Tomcat/5.5.9 | ||||
|
投稿日時: 2005-11-15 17:29
微妙なエラーですね・・・。 J2EE APIのjarをEARやWARに含めてしまっていませんか? あまりLinkageErrorが発生しそうな状況は思い浮かばないです。 #JBossを再起動するだけで直ることもあるかも? | ||||
|
投稿日時: 2005-11-16 13:18
あしゅさん
ご指摘のとおりWarの中に、jbossall-client.jarを 含めていました。jbossall-client.jarを削除したら正常に 動きました。 アドバイスありがとうございました(^^)/ |
1