- PR -

JAXMについての質問

1
投稿者投稿内容
ken
会議室デビュー日: 2003/03/27
投稿数: 14
投稿日時: 2003-04-24 14:46
現在、JAXMを使用してメッセージのやりとりをする
簡単なサンプルを作成しています。

Webで公開されているサンプルを手本にやっているのですが、
送信はうまくいっても、返信がうまくいきません。
以下に実行結果をします。

--サンプル実行結果--
コード:
C:\work\Client2>java HelloJAXMClient test

Send Message:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <n:Name xmlns:n="HellowJAXMServlet">test</n:Name>
 </soapenv:Body>
</soapenv:Envelope>

Result Message:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmln
s:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSc
hema-instance">
 <soapenv:Body>
  <soapenv:Fault>
   <faultcode>soapenv:Server.generalException</faultcode>
   <faultstring>Couldnt find an appropriate operation for XML QName {0}</faultst
ring>
   <detail/>
  </soapenv:Fault>
 </soapenv:Body>
</soapenv:Envelope>


-------------------
上記コードの下側のSOAPメッセージが返信の内容ですが、
その中に
コード:
<faultcode>soapenv:Server.generalException</faultcode>
<faultstring>Couldnt find an appropriate operation for XML QName {0}</faultstring>


というエラーがあります。
Namespaceに関するエラーかなと思い、いろいろ試してみたのですが、
どうしてもわかりません。

このエラーの原因がわかる方いらっしゃいましたら
教えてください。


下記は、作成したアプリケーションの概要とコードです。

--クライアント側--
メッセージを作成し、サーバへ送る
-----------------
コード:
import java.io.FileOutputStream;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.*;
import javax.xml.messaging.URLEndpoint;
import javax.xml.soap.*;

public class HelloJAXMClient
{
      public static void main (String args[])
      {
	try {
	   SOAPConnectionFactory scf = SOAPConnectionFactory.newInstance();
	   SOAPConnection scon = scf.createConnection();
	   MessageFactory msf = MessageFactory.newInstance();
	   SOAPMessage smsg = msf.createMessage();
	   SOAPPart soapPart = smsg.getSOAPPart();
	   SOAPEnvelope envelope = soapPart.getEnvelope();
	   SOAPBody body = envelope.getBody();
	   body.addBodyElement(envelope.createName("Name","n","HellowJAXMServlet")).addTextNode(args[0]);
	   smsg.saveChanges();
			
	   System.out.println("Send Message: ");
	   display(smsg);

	   SOAPMessage reply = scon.call(smsg,"http://localhost:8080/axis/services/HellowJAXMServlet?wsdl");
	   System.out.println("Result Message: ");
	   display(reply);
	   scon.close();

	} catch (Exception e) {
	   e.printStackTrace();
	}
      }

      private static void display(SOAPMessage inmsg) throws Exception {
	TransformerFactory  tFact = TransformerFactory.newInstance();
	Transformer transformer = tFact.newTransformer();
	Source src = inmsg.getSOAPPart().getContent();
	StreamResult result = new StreamResult(System.out);
	transformer.transform(src,result);
	System.out.println();
      }
}




--サーバ側--
メッセージをそのまま返す
------------
コード:
import javax.xml.messaging.*;
import javax.xml.soap.*;

public class HelloJAXMServlet extends JAXMServlet implements ReqRespListener
{
    public SOAPMessage onMessage(SOAPMessage msg)
    {
	return msg;
    }
}


ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-04-25 10:52
ども、ほむらです。
--------------------------------
SOAPメッセージのエラーというよりも
JAVAのソース単位のようなきがします。。。。
マルチになってしまうけどJAVAの方で聞いてみたほうがいいかもしれませんよ。

とりあえず、SUNにある参考資料のアドレスを張っておきます。

http://java.sun.com/xml/docs.html
Guides and Tutorials
Java Web Services Tutorial
から、
HTMLかPDFを
を選んで左フレームのChapter12にクライアントとサーバー側のコードが
載ってます。(どこかに(笑))
ただ、サーバー側はもっと複雑なつくりになっているみたいですが・・・

参照先を間違えていたので修正^^;;;;;

[ メッセージ編集済み 編集者: ほむら 編集日時 2003-04-25 10:55 ]
いたち
常連さん
会議室デビュー日: 2003/04/25
投稿数: 27
投稿日時: 2003-04-25 12:38
はじめまして、いたちと申します。

送信先URLが次のようになっていますが、
SOAPMessage reply = scon.call(smsg,"http://localhost:8080/axis/services/HellowJAXMServlet?wsdl");

最後の?wsdlはいらないのではないでしょうか?

あと、Envelopeの内容を標準出力に出していますが、SOAP Messagingを行うのであれば、Apache AxisについているTCP Monitorを使うと実際の通信内容がわかって良いと思いますよ。

ではでは
ken
会議室デビュー日: 2003/03/27
投稿数: 14
投稿日時: 2003-04-25 12:55
ほむらさん、いたちさんご指摘ありがとうございます。

確かに「?wsdl」はいりませんでした。いろいろ試しているうちに
付いてしまっていたようです。

TCPモニタでも確認をしたのですが、ヘッダ情報が加わって
後は同じ結果が見えるだけです。ヘッダ情報で問題を探るポイントなど
あれば教えて頂きたいのですが、
まずはほむらさんに紹介して頂いたチュートリアルを隅々読んでみます。



[ メッセージ編集済み 編集者: ken 編集日時 2003-04-25 12:59 ]
いたち
常連さん
会議室デビュー日: 2003/04/25
投稿数: 27
投稿日時: 2003-04-25 13:04
いたちです。

もしかして、もしかしたら
"http://localhost:8080/axis/services/HellowJAXMServlet?wsdl"

のwが余計とか(Hellowになってる)?

# 違ってたらごめんなさい。
ken
会議室デビュー日: 2003/03/27
投稿数: 14
投稿日時: 2003-04-25 16:52
ご指摘ありがとうございます。

私ももしかしてと思い、確認してみましたが
実際のコードではAxisに登録されているサービス名を
クライアントで使用していました。

会議室に投稿する為に作成したコードが間違っていたようです。
大変失礼致しました。気をつけます。

ここで、一つ分かったことがあるのですが、
Axisに登録されているWebサービスは「HelloJAXMServlet」
ですが、クライアントでWebサービスを呼び出すURLとして

"http://localhost:8080/axis/services/HelloJAXMServlet"
としても
"http://localhost:8080/axis/services/HellowJAXMServlet"
としても
同じ結果が返ってきてしまいます。

これはAxisへの登録がまずい証拠なのかな・・・と思っております。
以下にAxisへの登録で使用したwsddファイルを記載します。
※HelloJAXMServletはServer2パッケージに入っています。

ご意見ございましたら宜しくお願いいたします。

コード:
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance">
  <service name="HelloJAXMServlet" provider="java:MSG">
    <parameter name="className" value="Server2.HelloJAXMServlet"/>
    <parameter name="allowedMethods" value="*"/>
  </service>
</deployment>

kan
ベテラン
会議室デビュー日: 2002/11/28
投稿数: 55
投稿日時: 2003-04-28 02:46
ブラウザで「http://localhost:8080/axis/services/HelloJAXMServlet?wsdl」
にアクセスするとどうなりますか?

ところでAxisにはjavax.xml.messaging.JAXMServletはないと思うのですが。
Paul
ベテラン
会議室デビュー日: 2002/04/30
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2003-05-29 11:13
中込です。
まず、理解していただきたいことは、JAXMとAXISのアーキテクチャとサーバ側フレームワークです。
javax.xml.messaging.JAXMServletを継承し、javax.xml.messaging.ReqRespListenerインタフェースを実装したクラス(サービス)は、
Servletコンテナに配備し、Servletとしてサービスリクエスタからのメッセージを待ち受け、処理し、応答を返します。
この場合、HTTPのPOST要求でメッセージが到着すると、そのメッセージをパラメータ(javax.xml.soap.SOAPMessage)として、
当該クラスのonMessageメソッドが呼ばれます。この場合のシグネチャは以下のようになります。
SOAPMessage onMessage( SOAPMessage message );

一方AXISでは、制約はありますが、任意のJavaクラスをサービスとして配備するための仕組みを提供します。
HTTPをトランスポートにした場合、AXISエンジンの一部が、ServletとしてServletコンテナに配備され、
このServletを介して受信したSOAPメッセージを、AXISエンジン上に配備された任意のクラス(サービス)の
任意名のメソッドに通知するのです。java:MSG型(Messageサービス)で配備する場合、有効なシグネチャは以下の4つです。
public Element [] method(Element [] bodies);
public SOAPBodyElement [] method (SOAPBodyElement [] bodies);
public Document method(Document body);
public void method(SOAPEnvelope req, SOAPEnvelope resp);

さて、あなたのサービスについてですが、JAXMServletを継承しているにもかかわらず、Servletとして配備するのではなく、
AXISのMessageサービスとしてAXIS上に配備しようとしてらっしゃるようです。もちろんそれでも利用できないわけではありませんが、
その場合に必要なシグネチャを満たしていません。
1

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