Apache XML-RPC, кажется, не в состоянии проанализировать длинный тип, переданный ему android-xmlrpc - PullRequest
0 голосов
/ 21 декабря 2010

У меня небольшая проблема при разработке приложения для Android.У меня есть клиент (под управлением Android), использующий android-xmlrpc, который вызывает некоторые методы на сервере (стандартное приложение Java), используя Apache XML-RPC.Все работает нормально и плавно, за одним исключением.Когда я пытаюсь вызвать метод с параметром типа 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

Все должно быть в порядке, флаг EnabledForExtensions на стороне Apache, как указано здесь , установлено так:

serverConfig.setEnabledForExtensions(true);

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я нашел решение этой проблемы здесь: 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);
0 голосов
/ 21 декабря 2011

Кажется, есть два диалекта для длинных параметров, и клиент и сервер должны согласовать, какой использовать. Например, на сервере C ++ вам нужно позвонить:

myRegistry.setDialect(xmlrpc_dialect_apache)

Или

myRegistry.setDialect(xmlrpc_dialect_i8)

Или соответствующий метод на вашем клиенте / сервере.

Я считаю, что по умолчанию i8.

...