- PR -

EJBのLookupについて

1
投稿者投稿内容
ペーぺー01
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 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/08/05
投稿数: 613
投稿日時: 2005-11-12 01:11
引用:
<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>


この定義だけではctx.lookup("java:/comp/env/SearchAddress")で
参照する先がどこなのか確定できていないからでは?
<ejb-ref-name>はWAR側でどう見えるかの定義なので。

jboss-web.xml側で参照に対する物理名をマッピングするか、
<ejb-link>SearchAddress</ejb-link>とする必要がありそうです。
EJBがWARと同じEARの中にあるのなら後者の方がいいでしょう。
ペーぺー01
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 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/08/05
投稿数: 613
投稿日時: 2005-11-15 17:29
引用:
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)



微妙なエラーですね・・・。
J2EE APIのjarをEARやWARに含めてしまっていませんか?
あまりLinkageErrorが発生しそうな状況は思い浮かばないです。

#JBossを再起動するだけで直ることもあるかも?
ペーぺー01
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 2005-11-16 13:18
あしゅさん
ご指摘のとおりWarの中に、jbossall-client.jarを
含めていました。jbossall-client.jarを削除したら正常に
動きました。
アドバイスありがとうございました(^^)/
1

スキルアップ/キャリアアップ(JOB@IT)