【问题标题】:XML RPC server (PHP, Drupal) incompatibility with client (Java) on long integersXML RPC 服务器(PHP、Drupal)与长整数上的客户端(Java)不兼容
【发布时间】:2012-11-24 13:28:19
【问题描述】:

我正在编写一个 Java 应用程序,它与使用 XML RPC 支持的基于 Drupal 进行通信。

其中一个方法需要一个对象字典,这很好,因为它会自动转换为<struct>。但是,client library 转换Map<String, Object> 的方式是将任何整数转换为长整型。要在 XMLRPC 调用中support long integers,必须启用vendor extensions。但是,服务器不支持这些扩展。

据我所知,PHP 中没有任何东西可以支持<ex:i8> 之类的标签。有趣的是,supposedly official site for XMLRPC extensions 没有定义 detailed here。

除了循环遍历Map<String, Object> 的所有成员并手动将所有长整数转换为整数之外,还有什么方法可以在此处进行正确调用?

【问题讨论】:

  • 很抱歉写在这里 - 只是没有办法发送私人信息。我正在开发类似的应用程序:Java 应用程序与使用 XML RPC 支持的基于 Drupal 的通信,我有几个问题。如果您想聊天,请在 @skype 或 gtalk 或 msn 或 gmail 上联系我 - 我的昵称是 moisei 无处不在。

标签: java php drupal type-conversion xml-rpc


【解决方案1】:

我最终编写了这段代码,它将所有Long 实例转换为Map、HashMap 或JSONObject 中的Integer:

@SuppressWarnings("unchecked")
private Object fixLongs(Object p)
{
    String t = p.getClass().getName();
    if (t == "java.util.Map" || t == "java.util.HashMap" || t == "org.json.simple.JSONObject")
    {
        HashMap<Object, Object> n = new HashMap<Object, Object>(((HashMap<Object, Object>) p).size());
        Iterator<Entry<Object, Object>> it = ((HashMap<Object, Object>) p).entrySet().iterator();
        while (it.hasNext())
        {
            Entry<Object, Object> e = it.next();
            n.put(this.fixLongs(e.getKey()), this.fixLongs(e.getValue()));
        }
        return n;
    }
    else if (t == "java.lang.Long")
    {
        return new Integer(((Long) p).intValue());
    }
    else
    {
        return p;
    }
}

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 2020-12-10
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多