- - PR -
Webサービス上からEJBを呼び出す..
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 以上です.ご教示いただければ幸いです. よろしくお願いいたいます. |
|
投稿日時: 2004-11-26 09:48
throw Exceptionしちゃってるからサーバ(Webサービス)側の
どこでエラーが起きてるかわかりづらいような。 なので、Webサービスのどこのラインでエラーが発生するか 調べてみてはいかがでしょうか。 try catch? System.out.print? |
|
投稿日時: 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が発生します) よろしくお願いします. |
|
投稿日時: 2004-11-26 12:01
ぽちさんも指摘されていますが、サーバサイドのスタックトレースに有用な情報は出力されていないでしょうか?
|
|
投稿日時: 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; } そもそも,停止してしまう問題の箇所で例外は投げられていないのでしょうか・・ |
|
投稿日時: 2004-11-26 13:56
Exception ではなく Error が投げられているとか?
Throwable をキャッチしたらどうなるでしょうか? |
|
投稿日時: 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) |
|
投稿日時: 2004-11-26 14:38
lib配下には具体的に何を新規に配置しましたか?
リモートインタフェースクラスがないような感じですが。 ああ、shared/libじゃなくてWebapps/**/WEB-INF/libとかに 置いたらどうでしょう? TomcatでWebサービスということはAxisか何かでしょうかね。 [ メッセージ編集済み 編集者: (株)ぽち 編集日時 2004-11-26 14:42 ] |