Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Java] Strano tipo di array proveniente da web services Axis2

    Ciao,
    scrivendo il client per un web services in Java (usando Axis 2) mi sono imbattuto in uno strano tipo di array che non ho mai visto prima e che non sò come trattare. Questo tipo di array mi viene inviato dal web services ed avrei bisogno di una dritta per capire come trattarlo (anche perchè nella mia applicazione devo gestire quegli stessi dati con un ArrayList)

    In pratica la situazione è questa:
    Il web service mi risponde passandomi un oggetto avente tipo RecapitiAnagraficaResponse che in pratica rappresenta la response del web services che wrappa i risultati restituiti.

    Dentro questo oggetto response ho la mia lista degli indirizzi che devo trattare in qualche modo. Solo che invece che averla come un ArrayList o come una normale lista la ho nella forma:

    ArrayOf_tns1_Indirizzo listaIndirizzi = new ArrayOf_tns1_Indirizzo();
    (All'interno del web service viene creata proprio così)

    Per prima cosa che tipo assurdo di dati è: ArrayOf_tns1_Indirizzo? Ho notato che Axis2 mi ha creato varie collezioni come array di questo tipo che hanno il prefisso ArrayOf_tns1_ che dovrebbe essere una classe proprio creata da Axis 2?

    Insomma...lui mi restituisce questo array brutterrimo ma io dovrei poi poter mettere tutti i dati in questo coso dentro una normale ArrayList

    Qualche idea? qualcuno che ha già avuto a che fare con questo coso?

    Grazie
    Andrea

  2. #2

    Re: [Java] Strano tipo di array proveniente da web services Axis2

    Originariamente inviato da AndreaNobili
    Ciao,
    scrivendo il client per un web services in Java (usando Axis 2) mi sono imbattuto in uno strano tipo di array che non ho mai visto prima e che non sò come trattare. Questo tipo di array mi viene inviato dal web services ed avrei bisogno di una dritta per capire come trattarlo (anche perchè nella mia applicazione devo gestire quegli stessi dati con un ArrayList)

    In pratica la situazione è questa:
    Il web service mi risponde passandomi un oggetto avente tipo RecapitiAnagraficaResponse che in pratica rappresenta la response del web services che wrappa i risultati restituiti.

    Dentro questo oggetto response ho la mia lista degli indirizzi che devo trattare in qualche modo. Solo che invece che averla come un ArrayList o come una normale lista la ho nella forma:

    Arrapato_tns1_Indirizzo listaIndirizzi = new ArrayOf_tns1_Indirizzo();
    (All'interno del web service viene creata proprio così)

    Per prima cosa che tipo assurdo di dati è: ArrayOf_tns1_Indirizzo? Ho notato che Axis2 mi ha creato varie collezioni come array di questo tipo che hanno il prefisso ArrayOf_tns1_ che dovrebbe essere una classe proprio creata da Axis 2?

    Insomma...lui mi restituisce questo array brutterrimo ma io dovrei poi poter mettere tutti i dati in questo coso dentro una normale ArrayList

    Qualche idea? qualcuno che ha già avuto a che fare con questo coso?

    Grazie
    Andrea
    La frase "Questo tipo di array mi viene inviato dal web services" non è corretta. Cerco di chiarirti un po meglio come funzionano le cose. I webservices comunicano con i rispettivi client mediante scambio di messaggi XML conformi ad un dato protocollo, nel tuo caso immagino parliamo di SOAP visto che usi Axis2 , (che però supporta anche altri protocolli). Se ti interessa approfondire leggi qui . I tipi di dato scambiati hanno a che vedere solo e soltanto con il protocollo in questione (SOAP, XML-RPC o altri..) e sono codificati solo e soltanto come nodi all'interno degli XML scambiati (tramite altri protocolli di rete di livello più basso). Il tipo di dato strano, oggetto del tuo post, è soltanto il risultato della traduzione in classi java, da parte di un apposito comando del framework axis 2, di uno o più tipi di dato dichiarati dal webservice (nel suo WSDL). La traduzione in questione è avvenuta quando tu hai generato il cosiddetto stub (o client), cioè un insieme di classi java generate automaticamente sulla base del WSDL per interagire proprio con quel webservice (e solo con quello). Tutto ciò per dire che il tipo di dato in questione non ti deve spaventare, è strano perché è il risultato di una generazione automatica ma se lo smonti pezzo per pezzo (in termini di campi interni ed ereditarietà) ti accorgi che è riconducibile a classi java standard. Lo stub che hai generato è fatto per evitarti di scrivere a mano del codice java che costruisca i famosi messaggi xml (di cui ho accennato sopra) che il tuo client dovrebbe scambiare con il webservice dall'altra parte. Quello che andrebbe fatto (almeno a mio avviso), è evitare di usare direttamente i tipi di dato generati dallo stub nel tuo software, ma scrivere uno strato intermedio (un connettore) le cui interfacce abbiano parametri e valori di ritorno del TUO modello di dati e le cui implementazioni lavorino con i metodi dello stub occupandosi di tradurre in oggetti del tuo modello quelli dello stub. Faccio un banale esempio che spero ti aiuti a capire cosa intendo:

    Supponiamo di avere un WS semplicissimo con un solo metodo che ritorna una lista di utenti muniti di una username e un nome.
    Lo stub generato potrebbe avere un metodo del tipo

    codice:
    class Stub
    {
        ArrayOf_tns1_Utente  getArrayOfUtente();
    }
    Supponendo che il tuo modello abbia una classe

    codice:
    public class Utente
    {
         private String username;
         private String name;
         public void getUsername()
         {
             return username;
         }
         public void getName()
         {
            return name;
         }
    
         public String setUsername(String username)
         {
             this.username = username;
         }
          public String seName(String name)
         {
             this.name = name;
         }
    }
    Il tuo connector dovrà fare una cosa del tipo:
    codice:
    public class WSUsersConnector
    {
       List<User> getUsers()
       {  
            List<User> users = new ArrayList<User>();
            try{
                 ArrayOf_tns1_Utente utenti = stub.getArrayOfUtente();
                 Tns1_utente[] ui = utenti.getArray();
                 for(int i = 0; i < ui.lenght;i++) 
                {
                   User user = new User():
                   user. setUserame(....);               
                   user. setName(....);
                   users.add(user);
                }
                return users;
            }
             catch(RemoteException e)
             {
                return null;
            }
       }
    }
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  3. #3
    Il vantaggio di scrivere uno strato intermedio del genere sta nel fatto che se cambia l'interfaccia del webservice (cosa che comporta la rigenerazione dello stub) , l'impatto sul software rimane localizzato al connector (o quasi, perché se sono stati aggiunti metodi o cambiate cose come il numero di parametri dei metodi esistenti un impatto c'è anche sull'interfaccia del connector ed a cascata sul resto del software). I connector sono l'analogo dei DAO per l'interazione con i database. Ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  4. #4
    Grazie mille,
    sei stato chiarissimo. Ho seguito il tuo consiglio ed ho risolto il problema
    Ora mi stò impicciando un attimino su un'altra questione, casomai ti chiedo visto che sei molto competente :-)

    Tnx
    Andrea

  5. #5
    Originariamente inviato da AndreaNobili
    Grazie mille,
    sei stato chiarissimo. Ho seguito il tuo consiglio ed ho risolto il problema
    Ora mi stò impicciando un attimino su un'altra questione, casomai ti chiedo visto che sei molto competente :-)

    Tnx
    Andrea
    Nessun problema, ma se è un altro argomento apri un altro thread .
    Ciao
    Il centro dell'attenzione non è sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.