- PR -

Webサービス上からEJBを呼び出す..

投稿者投稿内容
takah
会議室デビュー日: 2004/11/26
投稿数: 15
投稿日時: 2004-11-26 02:31
こんばんわ.WebサービスをEJBクライアントとして構築し,外部からアクセスするための
プログラムを作成しているのですが,それに関して質問をさせてください.

あるWebサービス上から,EJBコンポーネントを呼び出したいのですが,どうしても上手くいきません.

Webサービスとして,以下のようなコードを実装・公開しています.

public class ItineraryHomeWrapper {
java.lang.String[] rtn = null;

public java.lang.String[] generate(String ticket , String leaveAirlineName , String leaveSeat , String returnAirlineName , String returnSeat , String hotelName , String roomNum ) throws Exception{
java.lang.String[] rtn = null;

-----------------以下,JNDI利用のためのプロパティ設定--------------------
System.setProperty("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
System.setProperty("java.naming.provider.url", "iiop://localhost:1050");
System.setProperty("java.naming.factory.url.pkgs.Naming", "com.sun.enterprise.naming ");


----------------以下,EJB呼び出しのための記述------------------------
InitialContext jndiContext = new InitialContext();
Object ref = jndiContext.lookup("itinerary");
itinerary.ItineraryHome home = (itinerary.ItineraryHome)
PortableRemoteObject.narrow(ref, itinerary.ItineraryHome.class);
itinerary.ItineraryInterface remote = home.create();
rtn = remote.generate( ticket , leaveAirlineName , leaveSeat , returnAirlineName , returnSeat , hotelName , roomNum );

return rtn;
}
}

このようなWebサービスの内容となっています.吐き出される例外は,以下のようなものです.

AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.reflect.InvocationTargetException
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace: AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.lang.reflect.InvocationTargetException
faultActor:
faultNode:
faultDetail:

java.lang.reflect.InvocationTargetException
at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:260)
at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:169)
at org.apache.axis.encoding.DeserializationContextImpl.endElement(DeserializationContextImpl.java:1015)
at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
at javax.xml.parsers.SAXParser.parse(Unknown Source)
at org.apache.axis.encoding.DeserializationContextImpl.parse(DeserializationContextImpl.java:242)
at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:538)
at org.apache.axis.Message.getSOAPEnvelope(Message.java:376)
at org.apache.axis.client.Call.invokeEngine(Call.java:2583)
at org.apache.axis.client.Call.invoke(Call.java:2553)
at org.apache.axis.client.Call.invoke(Call.java:2248)
at org.apache.axis.client.Call.invoke(Call.java:2171)
at org.apache.axis.client.Call.invoke(Call.java:1691)
at itinerary.ItineraryWrapper.generate(ItineraryWrapper.java:35)
at itinerary.Client.main(Client.java:22)

このコードと同様の,EJBのためのクライアントコードを別途記述して実行したところ,問題なくEJBにアクセスできました.従って,このコードに間違いは無いと思われます.
むしろ問題は,Tomcatの設定なのでしょうか...

Tomcat上では,%TOMCAT_HOME%/shared/libに,クライアントに必要なjarを含めてあります.これらは,J2EE1.3.1に含まれるライブラリ群です.

また,このようなWebサービスへアクセスするための,クライアントプログラムは,上手く動作しています.

まとめると,以下ののような全体像になっています

JavaプログラムによるWebサービスクライアント→Webサービス(EJBクライアント)
呼び出しに問題なし

JavaプログラムによるEJBクライアント→EJBコンポーネント
呼び出しに問題なし

WebサービスによるEJBクライアント→EJBコンポーネント
上記の例外が発生する

最後に,環境は以下の通りです.
・J2sdk1.4.2_05
・J2sdkee 1.3.1
・Tomcat 5.0

以上です.ご教示いただければ幸いです.
よろしくお願いいたいます.
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-11-26 09:48
throw Exceptionしちゃってるからサーバ(Webサービス)側の
どこでエラーが起きてるかわかりづらいような。

なので、Webサービスのどこのラインでエラーが発生するか
調べてみてはいかがでしょうか。
try catch? System.out.print?
takah
会議室デビュー日: 2004/11/26
投稿数: 15
投稿日時: 2004-11-26 11:56
早速のご返答,ありがとうございます.

エラーが発生している箇所を抜かしていました.申し訳ありません.
以下の部分でエラーが発生しています.

itinerary.ItineraryHome home = (itinerary.ItineraryHome)
PortableRemoteObject.narrow(ref, itinerary.ItineraryHome.class);

この行で発生しうる主な例外といえば,ClassCastExceptionが考えられます.
しかし,EJBコンポーネントデプロイ時に生成したクライアントJarを,common/lib上に配置しているので,これは違うと思われます.
(事実,common/lib上からJarを削除すると,ClassCastExceptionが発生します)

よろしくお願いします.
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-26 12:01
ぽちさんも指摘されていますが、サーバサイドのスタックトレースに有用な情報は出力されていないでしょうか?
takah
会議室デビュー日: 2004/11/26
投稿数: 15
投稿日時: 2004-11-26 13:44
例外を上位にthrowするのではなく,問題の箇所に対し,try〜catchにより,tomcatログ上でのトレースを取得しようとしましたところ,なぜかトレースを取得できませんでした.
ソースは,以下のような感じです.

try {
System.setProperty("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
System.setProperty("java.naming.provider.url", "iiop://localhost:1050");
System.setProperty("java.naming.factory.url.pkgs.Naming", "com.sun.enterprise.naming ");
System.out.println("hoge2223");//出力されました

InitialContext jndiContext = new InitialContext();
Object ref = jndiContext.lookup("itinerary");
System.out.println("hoge2224");//出力されました

itinerary.ItineraryHome home = (itinerary.ItineraryHome)
PortableRemoteObject.narrow(ref, itinerary.ItineraryHome.class);
System.out.println("hoge");//出力されなかった
itinerary.ItineraryInterface remote = home.create();
System.out.println("hoge");//出力されなかった
rtn = remote.generate( ticket , leaveAirlineName , leaveSeat , returnAirlineName , returnSeat , hotelName , roomNum );

} catch (Exception e) {

System.out.println("error!");
e.printStackTrace();
//throw e;
}

そもそも,停止してしまう問題の箇所で例外は投げられていないのでしょうか・・
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-26 13:56
Exception ではなく Error が投げられているとか?
Throwable をキャッチしたらどうなるでしょうか?
takah
会議室デビュー日: 2004/11/26
投稿数: 15
投稿日時: 2004-11-26 14:17
ご返信,ありがとうございます.
以下のように出力されました..
クラスパスの問題でしょうか.でも,EJBクライアントとして必要なJar類は,すべて
%TOMCAT_HOME%/shared/libに格納してあるはずなのですが..

error!
java.lang.NoClassDefFoundError: javax/ejb/EJBHome
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
3)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at org.apache.catalina.loader.StandardClassLoader.findClass(StandardClas
sLoader.java:520)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClas
sLoader.java:857)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClas
sLoader.java:756)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:12
3)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:251)
at java.net.URLClassLoader.access$100(URLClassLoader.java:55)
at java.net.URLClassLoader$1.run(URLClassLoader.java:194)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at org.apache.catalina.loader.StandardClassLoader.findClass(StandardClas
sLoader.java:520)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClas
sLoader.java:857)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClas
sLoader.java:756)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClas
sLoader.java:840)
at org.apache.catalina.loader.StandardClassLoader.loadClass(StandardClas
sLoader.java:756)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1370)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoa
der.java:1230)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:219)
at com.sun.corba.se.internal.util.JDKClassLoader.loadClass(JDKClassLoade
r.java:131)
at com.sun.corba.se.internal.util.JDKBridge.loadClassM(JDKBridge.java:17
7)
at com.sun.corba.se.internal.util.JDKBridge.loadClass(JDKBridge.java:80)

at com.sun.corba.se.internal.javax.rmi.CORBA.Util.loadClass(Util.java:30
4)
at javax.rmi.CORBA.Util.loadClass(Util.java:233)
at com.sun.corba.se.internal.util.Utility.loadClassOfType(Utility.java:3
16)
at com.sun.corba.se.internal.util.Utility.loadStub(Utility.java:897)
at com.sun.corba.se.internal.javax.rmi.PortableRemoteObject.narrow(Porta
bleRemoteObject.java:284)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:134)
at itinerary.ItineraryHomeWrapper.generate(ItineraryHomeWrapper.java:31)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.axis.providers.java.RPCProvider.invokeMethod(RPCProvider.j
ava:402)
at org.apache.axis.providers.java.RPCProvider.processMessage(RPCProvider
.java:309)
at org.apache.axis.providers.java.JavaProvider.invoke(JavaProvider.java:
333)
at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrateg
y.java:71)
at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:150)
at org.apache.axis.SimpleChain.invoke(SimpleChain.java:120)
at org.apache.axis.handlers.soap.SOAPService.invoke(SOAPService.java:481
)
at org.apache.axis.server.AxisServer.invoke(AxisServer.java:323)
at org.apache.axis.transport.http.AxisServlet.doPost(AxisServlet.java:85
4)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
at org.apache.axis.transport.http.AxisServletBase.service(AxisServletBas
e.java:339)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:284)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:204)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:257)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.StandardContextValve.invokeInternal(Standard
ContextValve.java:245)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:199)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:195)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:164)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:149)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:156)
at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValv
eContext.java:151)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.jav
a:564)
at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:972)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:20
6)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:828)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ssConnection(Http11Protocol.java:700)
at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java
:584)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadP
ool.java:683)
at java.lang.Thread.run(Thread.java:534)
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2004-11-26 14:38
lib配下には具体的に何を新規に配置しましたか?
リモートインタフェースクラスがないような感じですが。

ああ、shared/libじゃなくてWebapps/**/WEB-INF/libとかに
置いたらどうでしょう?

TomcatでWebサービスということはAxisか何かでしょうかね。

[ メッセージ編集済み 編集者: (株)ぽち 編集日時 2004-11-26 14:42 ]

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