- PR -

[Apache SOAP]パラメーターとしてDOM要素をメソッドに渡す方法

1
投稿者投稿内容
おす
会議室デビュー日: 2003/03/08
投稿数: 13
投稿日時: 2004-09-30 16:33
Apache SOAPにて
パラメタとして以下をメソッドに渡したいのですが
<request/>

以下のコードで試したところ
IllegalArgumentException 例外となってしまいます。
(org.w3c.dom.Element でないとダメです的な)


コード:
Call call = new Call();
call.setEncodingStyleURI(Constants.NS_URI_LITERAL_XML);

Vector paramList = new Vector();

Parameter param =
    new Parameter(
        "request",
        Element.class,
        null,
        Constants.NS_URI_LITERAL_XML);
paramList.addElement(param);

call.setParams(paramList);

Response resp = call.invoke(url, "");



以下もダメでした。

コード:
Call call = new Call();
call.setEncodingStyleURI(Constants.NS_URI_LITERAL_XML);

Vector paramList = new Vector();

DocumentBuilder docBuilder = XMLParserUtils.getXMLDocBuilder();
Document doc = docBuilder.newDocument();
Element element = doc.createElement("");

Parameter param =
    new Parameter(
        "request",
        Element.class,
        element,
        Constants.NS_URI_LITERAL_XML);
paramList.addElement(param);

call.setParams(paramList);

Response resp = call.invoke(url, "");



どのように書けば
<request/>
だけをパラメタとしてメソッドに渡せるのでしょうか?
ご存知のかた、ご教授お願いします。

環境
Apache SOAP 2.3.1
J2SE 1.4.2_03
ponkotu
会議室デビュー日: 2004/09/30
投稿数: 4
投稿日時: 2004-09-30 19:16
以下のコードでどうでしょうか。

Call call = new Call();
call.setEncodingStyleURI(Constants.NS_URI_LITERAL_XML);
call.setTargetObjectURI(urn_url); // 接続先のクラス指定
call.setMethodName(methodName); // メソッド名指定

Vector params = new Vector();
Document doc = new DocumentImpl();
Element root = doc.createElement("request"); // <request/>のみ渡す場合
Node node = doc.appendChild(root);
params.addElement(new Parameter("request", Element.class, root, Constants.NS_URI_LITERAL_XML));

call.setParams(params);
Response resp = call.invoke(new URL(url), "");

以上

動作環境
OS Solaris8
App Weblogic6.1 SP5
Java 1.3.1
Apache Soap 2.3.1

OS Solaris8
App SunOneAppServer7
Java 1.4.2
Apache Soap 2.3.1

以上の環境で動作しています。
おす
会議室デビュー日: 2003/03/08
投稿数: 13
投稿日時: 2004-09-30 19:38
ponkotuさん、ありがとうございます。
早速試してみたのですが
パラメタは以下の様になってしまいます。

コード:
<request>
<request/>
</request>


<request/>
だけをパラメタとしてリモートメソッドに渡す方法はないのでしょうか?
#無いわけないと思うのですが、全くわからない。。。

引用:

ponkotuさんの書き込み (2004-09-30 19:16) より:
以下のコードでどうでしょうか。

Call call = new Call();
call.setEncodingStyleURI(Constants.NS_URI_LITERAL_XML);
call.setTargetObjectURI(urn_url); // 接続先のクラス指定
call.setMethodName(methodName); // メソッド名指定

Vector params = new Vector();
Document doc = new DocumentImpl();
Element root = doc.createElement("request"); // <request/>のみ渡す場合
Node node = doc.appendChild(root);
params.addElement(new Parameter("request", Element.class, root, Constants.NS_URI_LITERAL_XML));

call.setParams(params);
Response resp = call.invoke(new URL(url), "");

以上

動作環境
OS Solaris8
App Weblogic6.1 SP5
Java 1.3.1
Apache Soap 2.3.1

OS Solaris8
App SunOneAppServer7
Java 1.4.2
Apache Soap 2.3.1

以上の環境で動作しています。

おす
会議室デビュー日: 2003/03/08
投稿数: 13
投稿日時: 2004-09-30 20:10
パラメタの作り方がわからないという件については自己解決?しました。

最初の投稿の、コード(2つあるうちの上の方)で

<request>

</request>

のパラメタが作れていました。
IllegalArgumentException 例外というのも嘘でした。
正しいパラメタを送っているにもかかわらず、SOAPサーバ側が不正なパラメタです
と怒っているようです。(仕様書通りに呼び出してるはずなのだが。。。)

<request/>

<request>

</request>

は同じと考えてよいのでしょうか?
ponkotu
会議室デビュー日: 2004/09/30
投稿数: 4
投稿日時: 2004-09-30 23:06
<request/>と<request></request>
は空要素の扱いとなるので、同じ意味となります。
ただし、XML解析するコードの実装により、
意味を別とするパターンもありえるかもしれません。(基本的にはないと思います)

空要素については、以下に詳しく書いています。
http://www.atmarkit.co.jp/aig/01xml/emptytag.html

以上
おす
会議室デビュー日: 2003/03/08
投稿数: 13
投稿日時: 2004-10-01 11:28
ponkotuさん、ありがとうございます。

引用:

<request/>と<request></request>
は空要素の扱いとなるので、同じ意味となります。



ですよね。SOAPサービス提供側が悪いということで問い合わせてみたいと思います。
ありがとうございました。
1

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