人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

http://blog.calta.info/2007/02/28/?p=52
Java で XMLRPC の API を利用しようと思っています。
そこで 上記URLの内容を参考にサンプルコードを作ってみました。
http://wacca.tv/help/api/songsearch
しかし作成したリクエストコードは、こちらのサンプルリクエストのように
<string> タグが付加されません。
Integer, Double, Boolean などは付加されます。
どのようにすれば <string>タグが付加されるようになるでしょうか。

●質問者: wshino
●カテゴリ:コンピュータ インターネット
✍キーワード:API DOUBLE Java URL コード
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● minkpa
●1ポイント

http://www.geocities.co.jp/SiliconValley-SanJose/3377/

◎質問者からの返答

ASN.1 でどうしろと。ポインタだけでなく、

具体的な解決方法を記述していただけるとありがたいのですが。

できるだけライブラリに手をいれたくありません。

質問に書き忘れていましたが、 Java1.6 を使用しています。


2 ● quintia
●100ポイント

http://issues.apache.org/jira/browse/XMLRPC-138

に同じ内容がでてます。


http://issues.apache.org/jira/browse/XMLRPC-138#description-open

リクエストの文字列に string 要素のタグが入らない。

StringSerializer.java の write メソッドで、write(pHandler, null, pObject.toString()) という呼び出しをしているところの第2引数はnullではなくて、STRING_TAGであるべきなのでは

という質問。


http://issues.apache.org/jira/browse/XMLRPC-138#action_12481758

型識別がなければ string と見なす。言い換えれば string 要素で括るか括らないかは optional だ。

ということです。


http://issues.apache.org/jira/browse/XMLRPC-138#action_12482074

の回答で、http://issues.apache.org/jira/browse/XMLRPC-138#action_12482074 の "Custom data type" のセクションを見よとのこと。


それを受けて、

http://issues.apache.org/jira/browse/XMLRPC-138#action_12482079

で解決していますね。

StringSerializer から派生した StringSerializer2 と、TypeFactoryImpl から派生した MyTypeFactory を作って、setTypeFactory してます。

お手軽にやるなら今あるソースにstaticな内部クラスとして定義してしまって、

(今あるpackage宣言 import文)
//ここから追加
import org.apache.xmlrpc.serializer.StringSerializer;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;

import org.apache.xmlrpc.common.TypeFactoryImpl;
import org.apache.xmlrpc.common.XmlRpcController;
import org.apache.xmlrpc.common.XmlRpcStreamConfig;
import org.apache.xmlrpc.serializer.TypeSerializer;
import org.xml.sax.SAXException;
//ここまで追加

public class Hoge {

//ここから追加
 public static class StringSerializer2 extends StringSerializer {
 public void write(ContentHandler pHandler, Object pObject) throws SAXException {
 write(pHandler, STRING_TAG, pObject.toString());
 }
 }

 public static class MyTypeFactory extends TypeFactoryImpl {
 public MyTypeFactory(XmlRpcController pController) {
 super(pController);
 }

 public TypeSerializer getSerializer(XmlRpcStreamConfig pConfig, Object pObject) throws SAXException {
 if (pObject instanceof String) {
 return new StringSerializer2();
 } else {
 return super.getSerializer(pConfig, pObject);
 }
 }
 }
//ここまで追加

(略)

XmlRpcClient client = new XmlRpcClient();

client.setTypeFactory(new MyTypeFactory(client)); //この行追加

(略)

}

でいけますね。

◎質問者からの返答

ありがとうございます。 custom data type を作らなければならないのですね。

すっきりしました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ