2015-03-26 12 views
13

Sto usando il mio servizio XMLRPC utilizzando la libreria Apache XMLRPC ma in reponse di XMLRPC ha carattere spazzatura in modo biblioteca non può analizzare il risultatoJava di Apache XMLRPC biblioteca

Qui, è il mio programma XMLRPC :

 
import java.net.URL; 

import org.apache.xmlrpc.client.XmlRpcClient; 
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; 


public class XMLRpcExample { 

    public static void main(String[] args) throws Exception{ 
     // TODO Auto-generated method stub 

     XmlRpcClientConfigImpl cf = new XmlRpcClientConfigImpl(); 
     cf.setServerURL(new URL("/xmlrpc/object")); 
     cf.setBasicUserName("admin"); 
     cf.setBasicPassword("m_demo"); 
     cf.setConnectionTimeout(60000); 
     XmlRpcClient client = new XmlRpcClient(); 
     client.setConfig(cf); 
     Object[] params = new Object[] {"dbname",1,"m_demo","res.partner","partner_sync_openerp","[email protected]","22"}; 
     String s =(String)client.execute("execute", params); 
     System.out.println(s); 
    } 

} 

Ma io sono sempre questo errore in risposta, che assomiglia a questo:

 
[Fatal Error] :16:16: An invalid XML character (Unicode: 0xc) was found in the element content of the document. 
Exception in thread "main" org.apache.xmlrpc.client.XmlRpcClientException: Failed to parse server's response: An invalid XML character (Unicode: 0xc) was found in the element content of the document. 
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:202) 
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.sendRequest(XmlRpcStreamTransport.java:165) 
    at org.apache.xmlrpc.client.XmlRpcHttpTransport.sendRequest(XmlRpcHttpTransport.java:125) 
    at org.apache.xmlrpc.client.XmlRpcSunHttpTransport.sendRequest(XmlRpcSunHttpTransport.java:69) 
    at org.apache.xmlrpc.client.XmlRpcClientWorker.execute(XmlRpcClientWorker.java:56) 
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:167) 
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:137) 
    at org.apache.xmlrpc.client.XmlRpcClient.execute(XmlRpcClient.java:126) 
    at XMLRpcExample.main(XMLRpcExample.java:21) 
Caused by: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 16; An invalid XML character (Unicode: 0xc) was found in the element content of the document. 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1237) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:551) 
    at org.apache.xmlrpc.client.XmlRpcStreamTransport.readResponse(XmlRpcStreamTransport.java:200) 
    ... 8 more 

L'XML-RPC dà un carattere spazzatura in reponse.

E la libreria stessa non riesce ad analizzare la risposta.

Significa che la libreria Apache XML-RPC non è in grado di analizzare la risposta.

Qualunque organismo può aiutarmi con ciò che devo fare?

Ho anche provato a risolvere questo problema via Internet ma non sono in grado di risolverlo.

+0

Ho avuto lo stesso problema. Sei riuscito a risolvere il problema? –

+0

Sai qual è la risposta, che viene rispedita in risposta alla tua domanda? (Potresti provare ad annusare il traffico con wireshark per vedere cosa viene restituito.) Forse è compresso in qualche modo o non sta usando XML affatto ... –

+0

@ AndréSchild No, in realtà la maggior parte delle chiamate alla procedura remota va bene. Questo succede raramente per alcune chiamate specifiche. Si noti che la procedura remota proviene da una terza parte e non può essere modificata. La modifica deve essere effettuata alla nostra fine per evitare questo errore. –

risposta

2

Ecco l'esempio di lavoro per i parametri, che possono aiutare a


Handler Classe:

public class Handler { 
    public String execute(String dbName, Integer i, String a, String b, String c, String d, String e){ 
     System.out.println("Got inputs: "+dbName+", "+i+", "+a+", "+b+", "+c+", "+d+", "+e); 
     return "<?xml version=\"1.0\"> <test>[email protected]</test>"; 
    } 
} 

più di tali gestori possono essere aggiunti utilizzando phm.addHandler("handler",Handler.class); al codice del server. Altri metodi possono essere aggiunti a questa classe e possono essere richiamati dal client.


XMLRPC Server:

import org.apache.xmlrpc.server.PropertyHandlerMapping; 
import org.apache.xmlrpc.server.XmlRpcServer; 
import org.apache.xmlrpc.server.XmlRpcServerConfigImpl; 
import org.apache.xmlrpc.webserver.WebServer; 

public class Server { 
    private static final int port = 8080; 

    public static void main(String[] args) throws Exception { 
     WebServer webServer = new WebServer(port); 
     XmlRpcServer xmlRpcServer = webServer.getXmlRpcServer(); 
     PropertyHandlerMapping phm = new PropertyHandlerMapping(); 
     phm.addHandler("handler",Handler.class); 
     xmlRpcServer.setHandlerMapping(phm); 
     XmlRpcServerConfigImpl serverConfig = 
       (XmlRpcServerConfigImpl) xmlRpcServer.getConfig(); 
     serverConfig.setEnabledForExtensions(true); 
     serverConfig.setContentLengthOptional(false); 
     webServer.start(); 
    } 
} 

XMLRPC Cliente:

import org.apache.xmlrpc.client.XmlRpcClient; 
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl; 

import java.net.URL; 

public class Client { 
    public static void main(String args[])throws Exception{ 
     XmlRpcClientConfigImpl cf = new XmlRpcClientConfigImpl(); 
     cf.setServerURL(new URL("http://localhost:8080/xmlrpc/object")); 
     cf.setBasicUserName("admin"); 
     cf.setBasicPassword("m_demo"); 
     cf.setConnectionTimeout(60000); 
     XmlRpcClient client = new XmlRpcClient(); 
     client.setConfig(cf); 
     Object[] params = new Object[] {"dbname",1,"m_demo","res.partner","partner_sync_openerp","[email protected]","22"}; 
     String s =(String)client.execute("handler.execute", params); 
     System.out.println(s); 
    } 
} 
+0

Cosa succede se il server in questione è un server di terze parti e sta inviando un carattere XML non valido in risposta a una chiamata rpc? Possiamo gestire/ignorare quel personaggio in qualche modo? –

+0

ha modificato l'esempio per inviare i caratteri speciali dal server. Questo è codificato durante la trasmissione da libreria e non è necessario preoccuparsi. –

+0

Restituendo 'return" "+ Character.toString ((char) 3) +" ";' dal server nella classe Handler, il client si blocca dando errore: 'An invalid Il carattere XML (Unicode: 0x3) è stato trovato nel contenuto dell'elemento del documento. Sai come risolvere questo al client senza cambiare il codice del server? –