【问题标题】:"wrong" array type in response using java Apache XML RPC 3.1.3 Server使用 java Apache XML RPC 3.1.3 服务器响应的“错误”数组类型
【发布时间】:2014-05-14 02:00:57
【问题描述】:

我正在尝试使用 apache xmlrpc (3.1.3) 库运行 XML RPC 服务器。

我在此服务器上实现了 XML RPC 规范 (http://xmlrpc.scripting.com/spec) 中要求的方法“system.listMethods”。

为了检查这个服务器是否遵循 XML RPC 规范,我做了一个客户端,它使我能够向服务器发出一个 Post 请求,发送我想要的 XML 文件(我把它写成一个 Sring 并且客户端发送它) .

然后,我的客户端打印服务器 XML 响应。

它有效,但是当我发布此请求时:

<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
    <methodName>system.listMethods</methodName>
    <params></params>
</methodCall>

它返回给我这个响应:

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse xmlns:ex="http://ws.apache.org/xmlrpc/namespaces/extensions">
    <params>
        <param>
            <value><array><data>
                <value>system.listMethods</value>
                <value>system.methodSignature</value>
                <value>system.methodHelp</value>
                <value>Calculator.add</value>
                <value>Calculator.subtract</value>
            </data></array></value>
        </param>
    </params>
</methodResponse>

根据规范,这是“错误的”。 这是我的方法列表,但结构中缺少它们。例如,它们应该是:

<value><string>system.listMethods</string></value>

插入

<value>system.listMethods</value>

在我的服务器中,“system.listMethods”方法返回一个 Object[] 类型的 java 对象(我尝试将其更改为 String[],但不影响结果)。 根据 apache 文档 (http://ws.apache.org/xmlrpc/types.html),这个 java 类型应该变成我应该使用的 XML-RCP 数组类型。

如何使我的服务器遵循 XML-RCP 规范?

在这种情况下,我只需在某处添加“&lt;string&gt;”或“&lt;/string&gt;”,但如规范数组类型示例所示,我应该可以混合数据类型:

<array>
   <data>
      <value><i4>12</i4></value>
      <value><string>Egypt</string></value>
      <value><boolean>0</boolean></value>
      <value><i4>-31</i4></value>
      </data>
   </array>

所以我试图找到一个解决方案,让我也能做到这一点。

【问题讨论】:

    标签: java xml apache rpc


    【解决方案1】:

    我终于找到了方法,所以如果有人有兴趣,我是这样做的:

    我创建了一个“自定义数据类型”,如此处同名部分所述: http://ws.apache.org/xmlrpc/advanced.html

    我还必须查看 org.apache.xmlrpc.serializer.StringSerializer 和 org.apache.xmlrpc.common.TypeFactoryImpl 的来源(在 GrepCode 上找到:http://grepcode.com/file/repo1.maven.org/maven2/org.apache.xmlrpc/xmlrpc-common/3.1.3/org/apache/xmlrpc/common/TypeFactoryImpl.java#TypeFactoryImpl.0STRING_SERIALIZER

    我必须创建两个类:

    MyStringSerializer:

    import org.apache.xmlrpc.serializer.*;<br>
    import org.xml.sax.ContentHandler;<br>
    import org.xml.sax.SAXException;
    
    public class MyStringSerializer extends TypeSerializerImpl {
        // Tag name of an string.
        public static final String STRING_TAG = "string";
    
        public void write(ContentHandler pHandler, Object pObject) throws SAXException {
            write(pHandler, STRING_TAG, pObject.toString());
        }
    }
    


    MyTypeFactory(调用方法而不是 TypeFactoryImpl):

    import org.apache.xmlrpc.common.TypeFactoryImpl;<br>
    import org.apache.xmlrpc.common.XmlRpcController;<br>
    import org.apache.xmlrpc.common.XmlRpcStreamConfig;<br>
    import org.apache.xmlrpc.serializer.TypeSerializer;<br>
    import org.xml.sax.SAXException;<br>
    
    public 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 MyStringSerializer();
            }else{
                return super.getSerializer(pConfig, pObject);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 2011-01-24
      相关资源
      最近更新 更多