http://blog.calta.info/2007/02/28/?p=52

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

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/10/15 16:33:57
  • 終了:2007/10/18 11:55:49

回答(2件)

id:minkpa No.1

minkpa回答回数4178ベストアンサー獲得回数552007/10/17 14:42:55

id:wshino

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

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

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

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

2007/10/17 17:59:28
id:quintia No.2

quintia回答回数561ベストアンサー獲得回数702007/10/18 11:49:38

ポイント100pt

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)); //この行追加

(略)

}

でいけますね。

id:wshino

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

すっきりしました。

2007/10/18 11:54:42

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません