【问题标题】:Apache XML-RPC seems unable to parse long type passed to it by android-xmlrpcApache XML-RPC 似乎无法解析 android-xmlrpc 传递给它的长类型
【发布时间】:2010-12-21 18:17:43
【问题描述】:

我在开发 Android 应用时遇到了一点问题。我有一个使用 android-xmlrpc 的客户端(运行 Android),它使用 Apache XML-RPC 在服务器(标准 Java 应用程序)上调用一些方法。除了一个例外,一切都运行良好且顺利。当我尝试调用具有 Long 类型参数的方法时,服务器会抛出此异常:

21.12.2010 18:54:35 org.apache.xmlrpc.server.XmlRpcErrorLogger log
SEVERE: Failed to parse XML-RPC request: Unknown type: i8
org.apache.xmlrpc.XmlRpcException: Failed to parse XML-RPC request: Unknown type: i8
at org.apache.xmlrpc.server.XmlRpcStreamServer.getRequest(XmlRpcStreamServer.java:71)
at org.apache.xmlrpc.server.XmlRpcStreamServer.execute(XmlRpcStreamServer.java:199)
at org.apache.xmlrpc.webserver.Connection.run(Connection.java:208)
at org.apache.xmlrpc.util.ThreadPool$Poolable$1.run(ThreadPool.java:68)

Caused by: org.xml.sax.SAXParseException: Unknown type: i8
at org.apache.xmlrpc.parser.RecursiveTypeParserImpl.startElement(RecursiveTypeParserImpl.java:122)
at org.apache.xmlrpc.parser.XmlRpcRequestParser.startElement(XmlRpcRequestParser.java:122)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
at org.apache.xmlrpc.server.XmlRpcStreamServer.getRequest(XmlRpcStreamServer.java:65)
... 3 more

一切都应该井井有条,Apache 端的 EnabledForExtensions 标志,如 here 所述,设置如下:

serverConfig.setEnabledForExtensions(true);

我做错了什么?

【问题讨论】:

    标签: java android apache xml-rpc long-integer


    【解决方案1】:

    Long 参数似乎有两种方言,客户端和服务器必须同意使用哪个方言。例如,在您需要调用的 c++ 服务器上:

    myRegistry.setDialect(xmlrpc_dialect_apache)
    

    或者

    myRegistry.setDialect(xmlrpc_dialect_i8)
    

    或者您的客户端/服务器上的相应方法。

    我相信默认是 i8。

    【讨论】:

    • C++ 服务器是什么意思?您提供的代码也是用 Java 还是什么?没有足够的上下文来理解您在代码示例中所做的事情
    【解决方案2】:

    我在这里找到了这个问题的解决方案:https://ws.apache.org/xmlrpc/advanced.html

    我必须创建自己的 TypeFactory 实现,如下所示:

    public class ExtendedTypeFactoryImpl extends TypeFactoryImpl  {
    
    private static final String LONG_XML_TAG_NAME = "i8";
    
    public ExtendedTypeFactoryImpl(XmlRpcController pController) {
        super(pController);
    }
    
    @Override
    public TypeParser getParser(XmlRpcStreamConfig pConfig, NamespaceContextImpl pContext, String pURI, String pLocalName) {
        if (LONG_XML_TAG_NAME.equals(pLocalName)) {
            return new LongParser();
        } else {
            return super.getParser(pConfig, pContext, pURI, pLocalName);
        }
    }
    }
    

    然后我必须设置我的 XMPRPC 客户端的类型工厂:

    XmlRpcClient client = new XmlRpcClient();
    XmlRpcClientConfigImpl conf = new XmlRpcClientConfigImpl();
    conf.setServerURL(url.toURL());
    conf.setEncoding(Charsets.UTF_8.name());
    conf.setEnabledForExtensions(true);
    client.setTypeFactory(new ExtendedTypeFactoryImpl(client));
    client.setConfig(conf);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多