2012-06-22 4 views
1

Je travaille sur un projet qui doit accéder à un service Web dotNet tiers. J'utilise ksoap2-j2se-full-2.1.2.jar (compatible Java 1.4). Je ne peux pas utiliser java> 1.4 (restrictions de plate-forme).KSOAP2 peut envoyer un type complexe mais ne peut pas le recevoir

Il utilise beaucoup de types de données complexes. Il existe une méthode particulière qui reçoit un objet complexe et renvoie le même type d'objet (éventuellement modifié).

La sérialisation fonctionne bien, mais la désérialisation ne fonctionne pas. La balise "atributos" provoque l'erreur.

Est-ce que quelqu'un sait s'il est possible d'utiliser le même type de données enregistré pour les deux façons ou au moins une meilleure façon de le faire à la main (je vais devoir faire pour beaucoup de méthodes)?

Désolé pour le long message long long. Mais je devais inclure tout ce qui s'y rapportait. Désolé pour le code bâclé. C'est juste un test.

Merci beaucoup.

Voici le XML de la demande:

<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://schemas.xmlsoap.org/soap/encoding/" xmlns:v="http://schemas.xmlsoap.org/soap/envelope/"> 
    <v:Header/> 
    <v:Body> 
     <iniciarExecucaoProcessoComTicket xmlns="http://tempuri.org/" id="o0" c:root="1"> 
      <ticketAutenticacao>4FSejSSb5JY8N5Sy+nwYDOxNaBsPhFuyF9Dsws8AiNQvwN0nGOUP8w==</ticketAutenticacao> 
      <idProcesso>10074</idProcesso> 
      <parametrosIniciais> 
       <n0:KeyValue xmlns:n0="http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"> 
        <n0:key>pnNome</n0:key> 
        <n0:value i:type="d:string">Person1</n0:value> 
       </n0:KeyValue> 
       <n1:KeyValue xmlns:n1="http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"> 
        <n1:key>pnNumero</n1:key> 
        <n1:value i:type="d:string">7001832700</n1:value> 
       </n1:KeyValue> 
       <n2:KeyValue xmlns:n2="http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"> 
        <n2:key>pnTipoSAP</n2:key> 
        <n2:value i:type="d:string">Z005</n2:value> 
       </n2:KeyValue> 
       <n3:KeyValue xmlns:n3="http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"> 
        <n3:key>CodCanal</n3:key> 
        <n3:value i:type="d:string">5</n3:value> 
       </n3:KeyValue> 
      </parametrosIniciais> 
     </iniciarExecucaoProcessoComTicket> 
    </v:Body> 
</v:Envelope> 

Voici le code XML de réponse:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
    <s:Body> 
     <iniciarExecucaoProcessoComTicketResponse xmlns="http://tempuri.org/"> 
      <iniciarExecucaoProcessoComTicketResult xmlns:a="http://schemas.datacontract.org/2004/07/MyWS.WS.EXT" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
       <a:atributos> 
        <a:KeyValue> 
         <a:key>pnNome</a:key> 
         <a:value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">Person 1</a:value> 
        </a:KeyValue> 
        <a:KeyValue> 
         <a:key>pnNumero</a:key> 
         <a:value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">7001832700</a:value> 
        </a:KeyValue> 
        <a:KeyValue> 
         <a:key>pnTipoSAP</a:key> 
         <a:value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">Z005</a:value> 
        </a:KeyValue> 
        <a:KeyValue> 
         <a:key>CodCanal</a:key> 
         <a:value xmlns:b="http://www.w3.org/2001/XMLSchema" i:type="b:string">5</a:value> 
        </a:KeyValue> 
       </a:atributos> 
       <a:dominio>0</a:dominio> 
       <a:ds xmlns:b="http://schemas.datacontract.org/2004/07/MyWS.DTO" i:nil="true"/> 
       <a:idInstanciaProcesso>66806</a:idInstanciaProcesso> 
       <a:idProcesso>10074</a:idProcesso> 
       <a:instanciaEmExecucao xmlns:b="http://schemas.datacontract.org/2004/07/MyWS.DTO" i:nil="true"/> 
       <a:nomeUsuario>7001832700</a:nomeUsuario> 
       <a:revisao>15076</a:revisao> 
       <a:statusInstanciaProcesso>NaoIniciado</a:statusInstanciaProcesso> 
      </iniciarExecucaoProcessoComTicketResult> 
     </iniciarExecucaoProcessoComTicketResponse> 
    </s:Body> 
</s:Envelope> 

Voici l'exception:

Unknown Property: KeyValue 
java.lang.RuntimeException: Unknown Property: KeyValue 
at org.ksoap2.serialization.SoapSerializationEnvelope.readSerializable(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.readInstance(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.read(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.readSerializable(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.readInstance(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.read(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.readSerializable(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.readInstance(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.read(Unknown Source) 
at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(Unknown Source) 
at org.ksoap2.SoapEnvelope.parse(Unknown Source) 
at org.ksoap2.transport.Transport.parseResponse(Unknown Source) 
at org.ksoap2.transport.HttpTransportSE.call(Unknown Source) 
at ServicoSegundaVia.iniciarExecucaoProcessoComTicket(ServicoSegundaVia.java:194) 
at ServicoSegundaVia.main(ServicoSegundaVia.java:25) 
Exception in thread "main" java.lang.NullPointerException 
at ServicoSegundaVia.main(ServicoSegundaVia.java:30) 
Java Result: 1 

Voici le code que je utilise :

// Calling code 
public static DadosInstanciaProcessoDTO iniciarExecucaoProcessoComTicket(){ 
    //Get Ticket 
    String ticket = "XYZ"; // Got from somewhere else 

    //Conect on Service....... 
    String sNAMESPACE = "http://tempuri.org/"; 
    String sMETHOD_NAME = "iniciarExecucaoProcessoComTicket"; 
    String sURL   = "http://192.168.0.197:88/WFPExecutorService.svc"; 
    String sSOAPAACTION = "http://tempuri.org/IWFPExecutorService/iniciarExecucaoProcessoComTicket"; 

    SoapObject request = new SoapObject(sNAMESPACE, sMETHOD_NAME); 

    request.addProperty("ticketAutenticacao", ticket); 
    request.addProperty("idProcesso", "10074"); 

    ParametrosIniciais parIni = new ParametrosIniciais(); 
    parIni.add(new KeyValue("pnNome", "Person 1")); 
    parIni.add(new KeyValue("pnNumero","7001832700")); 
    parIni.add(new KeyValue("pnTipoSAP","Z005")); 
    parIni.add(new KeyValue("CodCanal","5")); 

    PropertyInfo info = new PropertyInfo(); 
    info.name = "parametrosIniciais"; 
    info.type = ParametrosIniciais.class; 
    request.addProperty(info, parIni); 

    //ENVELOPE 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.implicitTypes = true; 
    envelope.setOutputSoapObject(request); 

    envelope.addMapping(sNAMESPACE, "iniciarExecucaoProcessoComTicketResponse", IniciarExecucaoProcessoComTicketResponse.class);   
    envelope.addMapping(sNAMESPACE, "iniciarExecucaoProcessoComTicketResult", DadosInstanciaProcessoDTO.class);   
    envelope.addMapping("http://schemas.datacontract.org/2004/07/MyWS.WS.EXT", "atributos", Atributos.class);   
    envelope.addMapping("http://schemas.datacontract.org/2004/07/MyWS.WS.EXT", "KeyValue", KeyValue.class);   

    //Creates a conection, using a String URL.. 
    HttpTransportSE myHttpTransport = new HttpTransportSE(sURL); 
    myHttpTransport.debug = true; 

    try { 
     myHttpTransport.call(sSOAPAACTION, envelope); 
     IniciarExecucaoProcessoComTicketResponse response = (IniciarExecucaoProcessoComTicketResponse)envelope.bodyIn; 
     DadosInstanciaProcessoDTO dto = response.getDadosIniExecProc(); 
     System.out.println(dto.getAtributo("pnNome")); 
     return dto; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return null; 
} 

Types de données:

package data; 

import java.util.Hashtable; 
import java.util.Vector; 
import org.ksoap2.serialization.KvmSerializable; 
import org.ksoap2.serialization.PropertyInfo; 

public class Atributos extends Vector implements KvmSerializable { 

    public Object getProperty(int i) { return this.get(i); } 

    public int getPropertyCount() { return this.size(); } 

    public void setProperty(int i, Object o) { this.add(o); } 

    public void getPropertyInfo(int arg0, Hashtable arg1, PropertyInfo pi) { 
     pi.name = "KeyValue"; 
     pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
     pi.type = KeyValue.class; 
    } 
} 

-

package data; 

import java.util.Hashtable; 
import org.ksoap2.serialization.KvmSerializable; 
import org.ksoap2.serialization.PropertyInfo; 

public class DadosExecucaoDTO implements KvmSerializable { 

    private Atributos atributos = null; 
    private String sDominio = ""; 
    private Object oDs = null; 
    private String sIdInstanciaProcesso = ""; 
    private String sIdProcesso = ""; 
    private Object oInstanciaEmExecucao = null; 
    private String sNomeUsuario = ""; 
    private String sRevisao = ""; 
    private String sStatusInstanciaProcesso = ""; 

    public Object getProperty(int i) { 
     switch (i) { 
      case 0: return atributos; 
      case 1: return sDominio; 
      case 2: return oDs; 
      case 3: return sIdInstanciaProcesso;     
      case 4: return sIdProcesso; 
      case 5: return oInstanciaEmExecucao; 
      case 6: return sNomeUsuario; 
      case 7: return sRevisao; 
      case 8: return sStatusInstanciaProcesso; 
     } 
     return null;  
    } 

    public int getPropertyCount() { 
     return 9; 
    } 

    public void setProperty(int i, Object o) { 
     switch (i) { 
      case 0: this.atributos = (Atributos)o; break; 
      case 1: this.sDominio = o.toString(); break;     
      case 2: this.oDs = o; break; 
      case 3: this.sIdInstanciaProcesso = o.toString(); break;     
      case 4: this.sIdProcesso = o.toString(); break; 
      case 5: this.oInstanciaEmExecucao = o; break; 
      case 6: this.sNomeUsuario = o.toString(); break; 
      case 7: this.sRevisao = o.toString(); break;     
      case 8: this.sStatusInstanciaProcesso = o.toString(); break;     
     }   
    } 

    public void getPropertyInfo(int i, Hashtable hshtbl, PropertyInfo pi) { 
     switch (i) { 
      case 0: 
       pi.name = "atributos"; pi.type = Atributos.class; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       break; 
      case 1: 
       pi.name = "dominio"; pi.type = PropertyInfo.STRING_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       break; 
      case 2: 
       pi.name = "ds"; pi.type = PropertyInfo.OBJECT_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.DTO"; 
       break;     
      case 3: 
       pi.name = "idInstanciaProcesso"; pi.type = PropertyInfo.STRING_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       break; 
      case 4: 
       pi.name = "idProcesso"; pi.type = PropertyInfo.STRING_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       break; 
      case 5: 
       pi.name = "instanciaEmExecucao"; pi.type = PropertyInfo.OBJECT_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.DTO"; 
       break; 
      case 6: 
       pi.name = "nomeUsuario"; pi.type = PropertyInfo.STRING_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       break;    
      case 7: 
       pi.name = "revisao"; pi.type = PropertyInfo.STRING_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       break; 
      case 8: 
       pi.name = "statusInstanciaProcesso"; pi.type = PropertyInfo.STRING_CLASS; 
       pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       break; 
     }   
    } 
} 

-

package data; 

import java.util.Hashtable; 
import org.ksoap2.serialization.KvmSerializable; 
import org.ksoap2.serialization.PropertyInfo; 

public class IniciarExecucaoProcessoComTicketResponse implements KvmSerializable { 
    private DadosInstanciaProcessoDTO iniciarExecucaoProcessoComTicketResult; 

    public DadosInstanciaProcessoDTO getDadosIniExecProc() { 
     return iniciarExecucaoProcessoComTicketResult; 
    } 

    public Object getProperty(int i) { 
     switch (i) { 
      case 0: return iniciarExecucaoProcessoComTicketResult; 
     } 
     return null; 
    } 

    public int getPropertyCount() { 
     return 1; 
    } 

    public void setProperty(int i, Object o) { 
     switch (i) { 
      case 0: this.iniciarExecucaoProcessoComTicketResult = (DadosInstanciaProcessoDTO)o; break; 
     } 
    } 

    public void getPropertyInfo(int index, Hashtable hshtbl, PropertyInfo info) { 
     switch (index) { 
      case 0: 
       info.type = DadosInstanciaProcessoDTO.class; 
       info.name = "iniciarExecucaoProcessoComTicketResult"; 
       break; 
     } 
    } 
} 

-

package data; 

import java.util.Hashtable; 
import org.ksoap2.serialization.KvmSerializable; 
import org.ksoap2.serialization.PropertyInfo; 

public class KeyValue implements KvmSerializable { 

    private String sKey = ""; 
    private String sValue = ""; 

    public KeyValue(String k, String v){ 
     this.sKey = k; this.sValue = v; 
    } 

    public Object getProperty(int i) { 
     switch (i) { 
      case 0: return sKey; 
      case 1: return sValue; 
     } 
     return null; 
    } 

    public int getPropertyCount() { 
     return 2; 
    } 

    public void setProperty(int i, Object o) { 
     switch (i) { 
      case 0: this.sKey = o.toString(); break; 
      case 1: this.sValue = o.toString(); break;     
     }  
    } 

    public void getPropertyInfo(int i, Hashtable hshtbl, PropertyInfo pi) { 
     switch (i) { 
      case 0: 
       pi.name = "key"; pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       pi.type = PropertyInfo.STRING_CLASS; 
       break; 
      case 1: 
       pi.name = "value"; pi.namespace = "http://schemas.datacontract.org/2004/07/MyWS.WS.EXT"; 
       pi.type = PropertyInfo.OBJECT_CLASS; 
       break;     
     }   
    } 
} 
+0

Pourriez-vous s'il vous plaît partager la solution? Je suis confronté au même problème en ce moment :( –

Répondre

1

Vous devez ajouter les accesseurs à tous t Il classes qui implémentent KvmSerializable.

+0

Rien n'a changé Il semble que le problème est lié à maaping lorsque l'espace de noms n'est pas défini dans le tag lui-même. – Marcus

Questions connexes