Autore Topic: [Eclipse+adt] Dubbi Connessione ad un Web Service  (Letto 2411 volte)

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
[Eclipse+adt] Dubbi Connessione ad un Web Service
« il: 16 Settembre 2010, 11:47:31 CEST »
0
Ciao ragazzi,
sto cercando di connettermi ad un web service tramite SOAP. Per farlo sto usando le librerie ksoap2

L'idea è passare latitudine, longitudine e un range quando chiamo il Web Service, per ottenere dei dati che dovrò visualizzare su una google map.

Il web service si trova su un altro computer che lo ha deployato correttamente su GlassFish. E' stato testato e funziona.

Ora lo vorrei chiamare con Android, nell'attività principale, Il WS restituisce una List di HashMap tramite un metodo apposito.

Ecco il codice significativo del WS, notate il metodo getRangePoi che torna una List di HasMap
Codice (Java): [Seleziona]
package integration;

import dao.PoiDao;
import domain.POI;
import org.springframework.remoting.jaxrpc.ServletEndpointSupport;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/* Classe che implementa il web service */

public class PoiServiceWS extends ServletEndpointSupport {

    private PoiDao poiDao;     // Dichiaro una variabile di tipo PoiDao generico

    /* Metodo chiamato per effettuare l'inizializzazione personalizzata dopo che
     * è stato specificato il contesto */

    @Override
    protected void onInit() {
        poiDao = (PoiDao)getWebApplicationContext().getBean("poiDao");
    }

    public List<HashMap>getRangePoi(String lon,String lat,String range)
    {
        System.out.println("Attenzione "+lon+" lat "+lat+" range "+range);
      return poiDao.getRangePoi(Float.parseFloat(lon), Float.parseFloat(lat), Integer.parseInt(range));
    }

    /* Metodo che restituisce tutti i POI */
    public List<HashMap>allPois(){

        // Crea una lista di generici ogetti POI
        List<POI> results = new ArrayList<POI>();
        //if(id!=null&&!id.equals(""))
        //    results=poiDAO.getPoi(id);
        //else

        /* Mette dentro result il riferimento ad una lista di POI restituita dal
         * metodo getListPoi del DAO */

        results = poiDao.getListPoi();

        // Crea una lista di oggetti generici di tipo HashMap (chiave, valore)
        List<HashMap> mappaOut=new ArrayList<HashMap>();
       
        // Per ogni oggetto poi contenuto nella lista result
        for(POI poi:results){

            // Crea un nuovo oggetto mappaPoi di tipo HashMap (chiave, valore)
            HashMap mappaPoi=new HashMap();

            // Setta i campi dell'oggetto mappaPoi appena creato
            mappaPoi.put("nome",poi.getNome());
            mappaPoi.put("lat",poi.getLat());
            mappaPoi.put("lon",poi.getLon());
            mappaPoi.put("alt",poi.getAlt());
            mappaPoi.put("tipologia",poi.getTipologia());
            mappaPoi.put("wikilink",poi.getWikiLink());
            //mappaPoi.put("poiId",poi.getPoiId()); ?!?!
            mappaPoi.put("id",poi.getId());

            // Aggiungi l'oggetto Hash Map appena creato alla lista dei POI
            mappaOut.add(mappaPoi);
        }

        // Ritorna al chiamante la lista che contiene gli ogetti HashMap che rappresentano i POI
        return mappaOut;
    }
}

L'attività Android è questa, vi posto il codice significativo:
Codice (Java): [Seleziona]
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
.
.
.//vari metodi onCreate() e onStart()
.
.
//--inizio: qui faccio la chimata al WS
    public void onResume(){
        super.onResume();
       
        Criteria criteria = new Criteria();  
        criteria.setAccuracy(Criteria.ACCURACY_FINE);
        String provider = locationManager.getBestProvider(criteria, true);  
        //se la posizione dell'utente è stata inizializzata (o cmq esiste)
        if(locationManager.getLastKnownLocation(provider) != null){
                //passo longitudine,latitudine e range
                Location l = locationManager.getLastKnownLocation(provider);
                double myLon = l.getLatitude();
                double myLat = l.getLongitude();
                int myRange = GuidaSubActivity.getRange();
                /* il meteodo getPois() fa la chiamata al web service */
                getPois(myLon,myLat,myRange);
                               //userò i dati qui
                }
    }//--fine

.
.
.
public void getPois(double userLon, double userLat, int userRange){
        Toast.makeText(this, "Loading POIs..", Toast.LENGTH_LONG).show();
        //soap_action: non passo niente cioè ""
        //method name: passo nome metodo getRangePoi
        //name_space: è http://example
        //URL : è l'indirizzo del wsdl ma senza ?wsdl
        //ok
        String SOAP_ACTION = "";
        //ok
        String METHOD_NAME = "http://localhost:8080/InsertPoi/services/PoiServiceWS?method=getRangePoi";
        //ok
        String NAMESPACE = "http://example";
        //ok
        String URL = "http://192.168.1.4:8080/InsertPoi/services/PoiServiceWS";        
        try{   
         SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
         //request.addProperty("ssn", ssn);
         request.addProperty("userLon",userLon);
         request.addProperty("userLat",userLat);
         request.addProperty("userRange",userRange);
         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
         envelope.setOutputSoapObject(request);
         AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
         try
                {
                androidHttpTransport.call(SOAP_ACTION, envelope);
                resultsRequestSOAP =  envelope.getResponse();
                String[] results = (String[])  resultsRequestSOAP;
                }
         catch (Exception aE)
                {
                        aE.printStackTrace ();;
                }
        Toast.makeText(this, "POIs obtained!", Toast.LENGTH_LONG).show();

                }catch(Exception bE){bE.printStackTrace();}
    }

Al di là del fatto che non sono sicuro che la connessione sia andata liscia così come la ricezione dei dati ottengo dal logcat questo WARNING:
Codice: [Seleziona]
09-16 09:17:37.309: WARN/System.err(295): java.lang.RuntimeException: Cannot serialize: 41.89016776666667
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:629)
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeProperty(SoapSerializationEnvelope.java:613)
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:582)
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeObjectBody(SoapSerializationEnvelope.java:566)
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeElement(SoapSerializationEnvelope.java:623)
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.serialization.SoapSerializationEnvelope.writeBody(SoapSerializationEnvelope.java:547)
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.SoapEnvelope.write(SoapEnvelope.java:192)
09-16 09:17:37.329: WARN/System.err(295):     at org.ksoap2.transport.Transport.createRequestData(Transport.java:74)
09-16 09:17:37.339: WARN/System.err(295):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:58)
09-16 09:17:37.339: WARN/System.err(295):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.getPois(GuidaGeoReferenziata.java:276)
09-16 09:17:37.339: WARN/System.err(295):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.onResume(GuidaGeoReferenziata.java:137)
09-16 09:17:37.339: WARN/System.err(295):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
09-16 09:17:37.339: WARN/System.err(295):     at android.app.Activity.performResume(Activity.java:3823)
09-16 09:17:37.339: WARN/System.err(295):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
09-16 09:17:37.339: WARN/System.err(295):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
09-16 09:17:37.339: WARN/System.err(295):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2059)
09-16 09:17:37.339: WARN/System.err(295):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-16 09:17:37.339: WARN/System.err(295):     at android.os.Looper.loop(Looper.java:123)
09-16 09:17:37.339: WARN/System.err(295):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-16 09:17:37.339: WARN/System.err(295):     at java.lang.reflect.Method.invokeNative(Native Method)
09-16 09:17:37.339: WARN/System.err(295):     at java.lang.reflect.Method.invoke(Method.java:521)
09-16 09:17:37.339: WARN/System.err(295):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-16 09:17:37.339: WARN/System.err(295):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-16 09:17:37.339: WARN/System.err(295):     at dalvik.system.NativeStart.main(Native Method)

 Come posso modificare il metodo getPois per gestire la List di HasMap e cosa vuol dire quel WARNING?
« Ultima modifica: 16 Settembre 2010, 15:11:29 CEST da Qlimax, Reason: ...[code=java][/code].... »

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #1 il: 16 Settembre 2010, 13:54:39 CEST »
0
Controlla che tutti gli oggetti che passi tramite WS implementino l'interfaccia Serializable.

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #2 il: 16 Settembre 2010, 14:46:24 CEST »
0
Controlla che tutti gli oggetti che passi tramite WS implementino l'interfaccia Serializable.
Mi stai dicendo che quella List di HasMap dovrebbe implementare l'interface Serializable?? Quello è un oggetto che non implemento, lo uso soltanto per memorizzare tutti quei dati.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #3 il: 16 Settembre 2010, 14:52:36 CEST »
0
No, dico che le istanze che metti dentro l'HashMap e la List devono essere Serializable! ;)

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #4 il: 16 Settembre 2010, 15:15:17 CEST »
0
Guarda getRangePoi è un metodo del Dao che non avevo postato. Sostanzialmente come puoi vedere dal codice sottostante esegue una query e mette i risultati di questa query nella lista di vettori di generici oggetti Object (credo che ogni elemento della lista corrisponda ad un record restituito dalla query, ed ogni elemento dei vari vettori rappresenta uno specifico campo di tali righe).

Infine la classe che implementa il web service trasforma tale lista di vector in una lista di hash map mediante il metodo createMapPOI e ne mette il risultato nella variabile pois che viene restituita dal WS al client...e tale lista di hashmap deve essere vista e lavorabile da Android. Praticamente credo che in ogni posizione della lista ricevuta dal palmare dovrebbe esserci una hashmap che rappresenta uno specifico punto di interessa con un suo id (la chiave della hash map credo, longitudine, latitudine, nome, etc) che poi nel mio client Android dovranno essere tirati fuori e visualizzati sulla Google Maps in base agli specifici valori di latitudine e longitudine...

Questo è il codice, il problema è che non ho la minima idea di come rendere serializzabile le cose all'interno della lista per evitare quell'errore....mi sai dare una mano? :-(


Codice: [Seleziona]
/* Implementazione per Hibernate dell'interfaccia PoiDao */

package dao;

import domain.POI;
import java.util.ArrayList;
import java.util.HashMap;

import org.hibernate.SessionFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.util.List;
import org.springframework.transaction.annotation.Transactional;

/** @author andrea */
/* Dichiaro un bean che potrà essere richiamato in altre classi */
@Component(value = "poiDao")
@Transactional
public class PoiDaoImpl implements PoiDao {

   /* Per richiamare un componente lo dichiaro come attributo nella classe in
    * cui lo voglio richiamare ed uso l'annotation @Autowired che esegue al mio
    * posto la dependency injection. L'annotation @Qualifier specifica di che
    * tipo di componente si tratta (non è necessaria ma aumenta la leggibilità) */
   @Autowired
   //@Qualifier("sessionFactory")
   private SessionFactory sessionFactory;

   /* Fà l'ovverride del metodo insert() astratto dichiarato nell'interfaccia:
    * prendo la sessione corrente e salvo l'oggetto nel database */
   public void insert(POI poi){
       this.sessionFactory.getCurrentSession().saveOrUpdate(poi);
    }

   /* Fà l'ovverride del metodo getListPoi() astratto dichiarato nell'interfaccia:
    * restituisce tutti i POI presenti nel DB */
    public List<POI> getListPoi()
    {
        List<POI> pois=new ArrayList<POI>();
        pois=sessionFactory.getCurrentSession().createQuery("select p from POI p").list();

        return pois;
    }

    public List<HashMap> getRangePoi(float lon, float lat, int range){

        List<HashMap> pois =new ArrayList<HashMap>();
        StringBuffer query = new StringBuffer();
        query.append("SELECT poi_id,alt,lat,lon,nome,tipologia,wikiLink, 3956 * 2 * ASIN(SQRT( ");
        query.append("POWER(SIN((:lat - abs(dest.lat)) * pi()/180 / 2), ");
        query.append("2) + COS(:lat * pi()/180 ) * COS(abs(dest.lat) * ");
        query.append("pi()/180) * POWER(SIN((:lon - dest.lon) * ");
        query.append("pi()/180 / 2), 2) )) as distance ");
        query.append("FROM points_of_interest dest ");
        query.append("having distance < :range ");
        query.append("ORDER BY distance limit 10 ");

        List<Object[]>res=sessionFactory.getCurrentSession().createSQLQuery(query.toString())
                .setParameter("lat", lat)
                .setParameter("lon", lon)
                .setParameter("range", range)
                .list();
        pois=createMapPOI(res);

        return pois;
    }

    private List<POI>createEntityPOI(List<Object[]> res)
    {
        List<POI> pois=new ArrayList<POI>();
        if(res!=null&&res.size()>0)
        {
            for(Object[] obj:res)
            {
                POI poi=new POI();
                poi.setId(obj[0]==null?0:(Integer)obj[0]);
                poi.setAlt(obj[1]==null?0:(Float)obj[1]);
                poi.setLat(obj[2]==null?0:(Float)obj[2]);
                poi.setLon(obj[3]==null?0:(Float)obj[3]);
                poi.setNome(obj[4]==null?"":(String)obj[4]);
                poi.setTipologia(obj[5]==null?0:(Integer)obj[5]);
                poi.setWikiLink(obj[6]==null?"":(String)obj[6]);
                poi.setDistance(obj[7]==null?0:(Double)obj[7]);

                pois.add(poi);



            }
        }

        return pois;
    }

    private List<HashMap>createMapPOI(List<Object[]> res)
    {
        List<HashMap> pois=new ArrayList<HashMap>();
        if(res!=null&&res.size()>0)
        {
            for(Object[] obj:res)
            {
                /* Ricordasi di fare string value of per portare a stringa */
                HashMap poi=new HashMap();
                poi.put("Id",obj[0]==null?0:(Integer)obj[0]);
                poi.put("Alt",obj[1]==null?0:(Float)obj[1]);
                poi.put("Lat",obj[2]==null?0:(Float)obj[2]);
                poi.put("Lon",obj[3]==null?0:(Float)obj[3]);
                poi.put("Nome",obj[4]==null?"":(String)obj[4]);
                poi.put("Tipologia",obj[5]==null?0:(Integer)obj[5]);
                poi.put("WikiLink",obj[6]==null?"":(String)obj[6]);
                poi.put("Distance",obj[7]==null?0:(Double)obj[7]);

                pois.add(poi);



            }
        }

        return pois;
    }
}

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #5 il: 16 Settembre 2010, 15:21:22 CEST »
0
Scusa ma se la latitudine e la longitudine le passi come stringhe? Dall'eccezione sembrerebbe che il problema sia quello.

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #6 il: 16 Settembre 2010, 15:28:42 CEST »
0
Che intendi, dal Client Andorid al WS o dal WS al Client Android??

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #7 il: 16 Settembre 2010, 15:36:00 CEST »
0
Tutti gli oggetti che usi sono Serializable... ci deve essere qualche altra cosa in ballo!

Sicuro che quello è l'unico errore che ti da?

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #8 il: 16 Settembre 2010, 15:57:40 CEST »
0
Allora il problema di prima era dovuto che il WS si aspettava delle String e io invece passavo tipi nativi, quindi avevate ragione.

In ogni caso ora ho questa eccezzione che compare sempre come WARNING dal LogCat, sebbene l'applicazione ritorni al suo stato normale:

Codice (Java): [Seleziona]
09-16 13:53:21.171: WARN/System.err(304): SoapFault - faultcode: 'soapenv:Server.userException' faultstring: 'org.xml.sax.SAXParseException: Element type "n0:http" must be followed by either attribute specifications, ">" or "/>".' faultactor: 'null' detail: org.kxml2.kdom.Node@43f29ac8
09-16 13:53:21.180: WARN/System.err(304):     at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:112)
09-16 13:53:21.180: WARN/System.err(304):     at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:137)
09-16 13:53:21.180: WARN/System.err(304):     at org.ksoap2.transport.Transport.parseResponse(Transport.java:63)
09-16 13:53:21.191: WARN/System.err(304):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100)
09-16 13:53:21.191: WARN/System.err(304):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.getPois(GuidaGeoReferenziata.java:280)
09-16 13:53:21.191: WARN/System.err(304):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.onResume(GuidaGeoReferenziata.java:142)
09-16 13:53:21.201: WARN/System.err(304):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
09-16 13:53:21.201: WARN/System.err(304):     at android.app.Activity.performResume(Activity.java:3823)
09-16 13:53:21.201: WARN/System.err(304):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
09-16 13:53:21.201: WARN/System.err(304):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
09-16 13:53:21.201: WARN/System.err(304):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2059)
09-16 13:53:21.201: WARN/System.err(304):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-16 13:53:21.221: WARN/System.err(304):     at android.os.Looper.loop(Looper.java:123)
09-16 13:53:21.221: WARN/System.err(304):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-16 13:53:21.221: WARN/System.err(304):     at java.lang.reflect.Method.invokeNative(Native Method)
09-16 13:53:21.240: WARN/System.err(304):     at java.lang.reflect.Method.invoke(Method.java:521)
09-16 13:53:21.250: WARN/System.err(304):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-16 13:53:21.250: WARN/System.err(304):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-16 13:53:21.250: WARN/System.err(304):     at dalvik.system.NativeStart.main(Native Method)
« Ultima modifica: 16 Settembre 2010, 16:34:16 CEST da helldron »

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #9 il: 16 Settembre 2010, 16:24:06 CEST »
0
Ciao helldron, potresti modificare il post di prima usando i tag per la pubblicazione di codice java?
il bottone è questo:


grazie mille

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #10 il: 16 Settembre 2010, 16:35:10 CEST »
0
Ciao helldron, potresti modificare il post di prima usando i tag per la pubblicazione di codice java?
il bottone è questo:


grazie mille
Fatto ma non cambia granchè..

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #12 il: 16 Settembre 2010, 17:10:28 CEST »
0
Ah ok vuoi quel codice sotto il tag java-code

Eccolo:
Codice (Java): [Seleziona]
/* Implementazione per Hibernate dell'interfaccia PoiDao */

package dao;

import domain.POI;
import java.util.ArrayList;
import java.util.HashMap;

import org.hibernate.SessionFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import java.util.List;
import org.springframework.transaction.annotation.Transactional;

/** @author andrea */
/* Dichiaro un bean che potrà essere richiamato in altre classi */
@Component(value = "poiDao")
@Transactional
public class PoiDaoImpl implements PoiDao {

   /* Per richiamare un componente lo dichiaro come attributo nella classe in
    * cui lo voglio richiamare ed uso l'annotation @Autowired che esegue al mio
    * posto la dependency injection. L'annotation @Qualifier specifica di che
    * tipo di componente si tratta (non è necessaria ma aumenta la leggibilità) */

   @Autowired
   //@Qualifier("sessionFactory")
   private SessionFactory sessionFactory;

   /* Fà l'ovverride del metodo insert() astratto dichiarato nell'interfaccia:
    * prendo la sessione corrente e salvo l'oggetto nel database */

   public void insert(POI poi){
       this.sessionFactory.getCurrentSession().saveOrUpdate(poi);
    }

   /* Fà l'ovverride del metodo getListPoi() astratto dichiarato nell'interfaccia:
    * restituisce tutti i POI presenti nel DB */

    public List<POI> getListPoi()
    {
        List<POI> pois=new ArrayList<POI>();
        pois=sessionFactory.getCurrentSession().createQuery("select p from POI p").list();

        return pois;
    }

    public List<HashMap> getRangePoi(float lon, float lat, int range){

        List<HashMap> pois =new ArrayList<HashMap>();
        StringBuffer query = new StringBuffer();
        query.append("SELECT poi_id,alt,lat,lon,nome,tipologia,wikiLink, 3956 * 2 * ASIN(SQRT( ");
        query.append("POWER(SIN((:lat - abs(dest.lat)) * pi()/180 / 2), ");
        query.append("2) + COS(:lat * pi()/180 ) * COS(abs(dest.lat) * ");
        query.append("pi()/180) * POWER(SIN((:lon - dest.lon) * ");
        query.append("pi()/180 / 2), 2) )) as distance ");
        query.append("FROM points_of_interest dest ");
        query.append("having distance < :range ");
        query.append("ORDER BY distance limit 10 ");

        List<Object[]>res=sessionFactory.getCurrentSession().createSQLQuery(query.toString())
                .setParameter("lat", lat)
                .setParameter("lon", lon)
                .setParameter("range", range)
                .list();
        pois=createMapPOI(res);

        return pois;
    }

    private List<POI>createEntityPOI(List<Object[]> res)
    {
        List<POI> pois=new ArrayList<POI>();
        if(res!=null&&res.size()>0)
        {
            for(Object[] obj:res)
            {
                POI poi=new POI();
                poi.setId(obj[0]==null?0:(Integer)obj[0]);
                poi.setAlt(obj[1]==null?0:(Float)obj[1]);
                poi.setLat(obj[2]==null?0:(Float)obj[2]);
                poi.setLon(obj[3]==null?0:(Float)obj[3]);
                poi.setNome(obj[4]==null?"":(String)obj[4]);
                poi.setTipologia(obj[5]==null?0:(Integer)obj[5]);
                poi.setWikiLink(obj[6]==null?"":(String)obj[6]);
                poi.setDistance(obj[7]==null?0:(Double)obj[7]);

                pois.add(poi);



            }
        }

        return pois;
    }

    private List<HashMap>createMapPOI(List<Object[]> res)
    {
        List<HashMap> pois=new ArrayList<HashMap>();
        if(res!=null&&res.size()>0)
        {
            for(Object[] obj:res)
            {
                /* Ricordasi di fare string value of per portare a stringa */
                HashMap poi=new HashMap();
                poi.put("Id",obj[0]==null?0:(Integer)obj[0]);
                poi.put("Alt",obj[1]==null?0:(Float)obj[1]);
                poi.put("Lat",obj[2]==null?0:(Float)obj[2]);
                poi.put("Lon",obj[3]==null?0:(Float)obj[3]);
                poi.put("Nome",obj[4]==null?"":(String)obj[4]);
                poi.put("Tipologia",obj[5]==null?0:(Integer)obj[5]);
                poi.put("WikiLink",obj[6]==null?"":(String)obj[6]);
                poi.put("Distance",obj[7]==null?0:(Double)obj[7]);

                pois.add(poi);



            }
        }

        return pois;
    }
}

Offline helldron

  • Utente junior
  • **
  • Post: 68
  • Respect: 0
    • Mostra profilo
Re:[Eclipse+adt] Dubbi Connessione ad un Web Service
« Risposta #13 il: 18 Settembre 2010, 11:44:11 CEST »
0
Sto provando a usare 2 approcci, il primo è così:

Codice (Java): [Seleziona]
public void getPois(String userLon, String userLat, String userRange){
        Toast.makeText(this, "Loading POIs..", Toast.LENGTH_LONG).show();
        //soap_action: non passo niente cioè ""
        //method name: passo nome metodo getRangePoi
        //name_space: è http://example
        //URL : è l'indirizzo del wsdl ma senza ?wsdl
        //ok
        String SOAP_ACTION = "";
        //ok
        String METHOD_NAME = "http://192.168.1.6:8080/InsertPoi/services/PoiServiceWS?method=getRangePoi";
        //ok
        String NAMESPACE = "http://example";
        //ok
        String URL = "http://192.168.1.6:8080/InsertPoi/services/PoiServiceWS";        
        try{   
         SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
         //request.addProperty("ssn", ssn);
         request.addProperty("userLon",userLon);
         request.addProperty("userLat",userLat);
         request.addProperty("userRange",userRange);
         //creo il messaggio
         SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
         //diciamo all'envelope che tipo di request deve fare
         envelope.setOutputSoapObject(request);
         //creo la connessione
         AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL);
                try
                {
                        //chiama il WS
                androidHttpTransport.call(SOAP_ACTION, envelope);
                                                        //getResponse() restituisce un Object
                                                        resultsRequestSOAP =  envelope.getResponse();
                                                        String[] results = (String[])  resultsRequestSOAP;
                //--prova
                //SoapObject body = (SoapObject)envelope.bodyIn;
                //Vector<Object> virtualServerList = (Vector) body.getProperty(0);
                        Toast.makeText(this, results.toString(), Toast.LENGTH_LONG).show();

                }
                catch (Exception aE)
                {
                        aE.printStackTrace ();
                        Toast.makeText(this, aE.toString(), Toast.LENGTH_LONG).show();
                }
        Toast.makeText(this, "POIs obtained!", Toast.LENGTH_LONG).show();

                }catch(Exception bE)
                        {
                                bE.printStackTrace();
                                Toast.makeText(this, bE.toString(), Toast.LENGTH_LONG).show();
                        }
    }
}

Visualizza il toast dell'exception e in particolare dal logcat lancia questa eccezzione:

Codice (Java): [Seleziona]
09-18 09:47:59.152: WARN/System.err(298): SoapFault - faultcode: 'soapenv:Server.userException' faultstring: 'org.xml.sax.SAXParseException: Element type "n0:http" must be followed by either attribute specifications, ">" or "/>".' faultactor: 'null' detail: org.kxml2.kdom.Node@43eaef68
09-18 09:47:59.172: WARN/System.err(298):     at org.ksoap2.serialization.SoapSerializationEnvelope.parseBody(SoapSerializationEnvelope.java:112)
09-18 09:47:59.172: WARN/System.err(298):     at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:137)
09-18 09:47:59.182: WARN/System.err(298):     at org.ksoap2.transport.Transport.parseResponse(Transport.java:63)
09-18 09:47:59.182: WARN/System.err(298):     at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100)
09-18 09:47:59.192: WARN/System.err(298):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.getPois(GuidaGeoReferenziata.java:286)
09-18 09:47:59.192: WARN/System.err(298):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.onResume(GuidaGeoReferenziata.java:144)
09-18 09:47:59.192: WARN/System.err(298):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
09-18 09:47:59.202: WARN/System.err(298):     at android.app.Activity.performResume(Activity.java:3823)
09-18 09:47:59.202: WARN/System.err(298):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
09-18 09:47:59.212: WARN/System.err(298):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
09-18 09:47:59.212: WARN/System.err(298):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2059)
09-18 09:47:59.222: WARN/System.err(298):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-18 09:47:59.222: WARN/System.err(298):     at android.os.Looper.loop(Looper.java:123)
09-18 09:47:59.232: WARN/System.err(298):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-18 09:47:59.232: WARN/System.err(298):     at java.lang.reflect.Method.invokeNative(Native Method)
09-18 09:47:59.242: WARN/System.err(298):     at java.lang.reflect.Method.invoke(Method.java:521)
09-18 09:47:59.242: WARN/System.err(298):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-18 09:47:59.252: WARN/System.err(298):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-18 09:47:59.252: WARN/System.err(298):     at dalvik.system.NativeStart.main(Native Method)

L'altro modo prevede dopo la linea

androidHttpTransport.call(SOAP_ACTION, envelope);

questa gestione della response:

Codice (Java): [Seleziona]
SoapObject body = (SoapObject)envelope.bodyIn;
Vector<Object> virtualServerList = (Vector) body.getProperty(0);
Toast.makeText(this, virtualServerList.toString(), Toast.LENGTH_LONG).show();

Questo secondo approccio da un'altra eccezzione, forse non riesce a fare il cast:

Codice (Java): [Seleziona]
09-18 09:39:13.005: WARN/System.err(290): java.lang.ClassCastException: org.ksoap2.SoapFault
09-18 09:39:13.045: WARN/System.err(290):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.getPois(GuidaGeoReferenziata.java:291)
09-18 09:39:13.064: INFO/ActivityManager(66): Process android.process.acore (pid 160) has died.
09-18 09:39:13.085: WARN/System.err(290):     at mieapplicazioni.guidageoreferenziata.GuidaGeoReferenziata.onResume(GuidaGeoReferenziata.java:144)
09-18 09:39:13.085: WARN/System.err(290):     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1149)
09-18 09:39:13.085: WARN/System.err(290):     at android.app.Activity.performResume(Activity.java:3823)
09-18 09:39:13.095: WARN/System.err(290):     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3118)
09-18 09:39:13.095: WARN/System.err(290):     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3143)
09-18 09:39:13.105: WARN/System.err(290):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2059)
09-18 09:39:13.105: WARN/System.err(290):     at android.os.Handler.dispatchMessage(Handler.java:99)
09-18 09:39:13.105: WARN/System.err(290):     at android.os.Looper.loop(Looper.java:123)
09-18 09:39:13.115: WARN/System.err(290):     at android.app.ActivityThread.main(ActivityThread.java:4627)
09-18 09:39:13.115: WARN/System.err(290):     at java.lang.reflect.Method.invokeNative(Native Method)
09-18 09:39:13.125: WARN/System.err(290):     at java.lang.reflect.Method.invoke(Method.java:521)
09-18 09:39:13.125: WARN/System.err(290):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
09-18 09:39:13.125: WARN/System.err(290):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
09-18 09:39:13.135: WARN/System.err(290):     at dalvik.system.NativeStart.main(Native Method)

Se vi serve l'attività completa date un'occhiata su!!
« Ultima modifica: 18 Settembre 2010, 11:50:23 CEST da helldron »