Aiuto sull'uso di database attraverso web service

mercoledì 01 luglio 2009 - 01.35

kierkegaard Profilo | Newbie

Ciao,

vorrei interrogare un database in locale attraverso un web service ma non riesco a capire come fare. Sto usando tomcat, axis, mysql e java. Sia Tomcat che Axis sono ok. Per il momento sono riuscito solo a realizzare un web service in cui il client chiama un metodo sul ws il quale ritorna una stringa. Fin qui tutto bene, tutto funziona. Poi ho realizzato il programma per interrogare il database senza web service (sempre in java) e anche fino a qui ci sono. Poi ho provato a realizzarlo attraverso web service in questo modo: 2 files, ClientWS.java e ServerWS.java

public class ClientWS { public static void main(String args[]){ String messaggio = null; //String query = "select * from limbs"; try { Call call = (Call) new Service().createCall(); call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/")); call.setOperationName(new QName("DatabaseWS01", "chiamata")); Object rispostaWS = call.invoke(new Object[]{"select * from limbs"}); messaggio = "il Web service ha risposto: " + (String) rispostaWS; } catch (MalformedURLException ex) { messaggio = "errore: l'url non è esatta"; }catch (ServiceException ex) { messaggio = "errore: la creazione della chiamata è fallita"; }catch (RemoteException ex) { messaggio = "errore: l'invocazione del WS è fallita. " + ex.getMessage() + "."; }finally{ System.out.println(messaggio); } } }

e l'altro...

public class ServerWS { String url; String user; String password; String driverName = "com.mysql.jdbc.Driver"; Statement stmnt; Connection conn = null; ResultSet rs; public String chiamata(String query) { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } url = "jdbc:mysql://localhost/miodatabase"; user = "user"; password = "pass"; try { conn = (Connection) DriverManager.getConnection(url,user,password); } catch (SQLException e) { e.printStackTrace(); } try { stmnt = (Statement) conn.createStatement(); rs = stmnt.executeQuery(query); while(rs.next()) { //di ogni riga salvo in thing il valore alla prima colonna della tabella limbs String thing = rs.getString(1); //di ogni riga salvo in thing il valore alla seconda colonna della tabella limbs int legs = rs.getInt(2); //di ogni riga salvo in thing il valore alla terza colonna della tabella limbs int arms = rs.getInt(3); System.out.println(thing + "," + legs + "," + arms); } } catch (SQLException e) { e.printStackTrace(); } } }

e ottengo qesto errore: "errore: l'invocazione del WS è fallita. java.lang.reflect.InvocationTargetException."
Sperando che qualcuno mi illumini, intanto vi ringrazio x l'attenzione!! ;)

Jeremy Profilo | Guru

Ciao.
Questa Riga:
>call.setOperationName(new QName("DatabaseWS01", "chiamata"));
dovrebbe diventare:
call.setOperationName(new QName("ServerWS", "chiamata"));

Prova e .... Facci sapere...
Ciao

kierkegaard Profilo | Newbie

Ciao e grazie x aver risposto :p

Ho provato come dici tu ma ottengo questo errore "errore: l'invocazione del WS è fallita. The AXIS engine could not find a target service to invoke! targetService is ." In effetti
QName("ServerWS", "chiamata")
non dovrebbe contenere il nome del servizio specificato nel deploy e il metodo esposto?

Intanto ho fatto questa prova: commentando tutto il codice relativo alla connessione al database ServerWS e lasciando solo il return in questo modo

public class ServerWS { String url; String user; String password; String driverName = "com.mysql.jdbc.Driver"; Statement stmnt; Connection conn = null; ResultSet rs; public String chiamata(String query) { /* try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } url = "jdbc:mysql://localhost/miodatabase"; user = "user"; password = "pass"; try { conn = (Connection) DriverManager.getConnection(url,user,password); } catch (SQLException e) { e.printStackTrace(); } System.out.println("Ciao sono il Server serverws, ho ricevuto questa query: " + query); try { stmnt = (Statement) conn.createStatement(); rs = stmnt.executeQuery(query); while(rs.next()) { //long id = rs.getLong(1); //long id = rs.getLong("thing"); //di ogni riga salvo in thing il valore alla prima colonna della tabella limbs String thing = rs.getString(1); //di ogni riga salvo in thing il valore alla seconda colonna della tabella limbs int legs = rs.getInt(2); //di ogni riga salvo in thing il valore alla terza colonna della tabella limbs int arms = rs.getInt(3); System.out.println(thing + "," + legs + "," + arms); } } catch (SQLException e) { e.printStackTrace(); } */ return "Il Server serverws risponde: " + query; } }

il tutto funziona rispondendomi "il Web service ha risposto: Il Server serverws risponde: select * from limbs". Il problema a questo punto dovrebbe essere dentro il codice commentato :p

Jeremy Profilo | Guru

>Ciao e grazie x aver risposto :p
>
>Ho provato come dici tu ma ottengo questo errore "errore: l'invocazione
>del WS è fallita. The AXIS engine could not find a target service
>to invoke! targetService is ." In effetti QName("ServerWS",
>"chiamata") non dovrebbe contenere il nome del servizio specificato
>nel deploy e il metodo esposto?
Si ma .... pensavo lo avessi cannato!!

>il tutto funziona rispondendomi "il Web service ha risposto:
>Il Server serverws risponde: select * from limbs". Il problema
>a questo punto dovrebbe essere dentro il codice commentato :p
Se non hai modo fi fare il debug ... scommenta una riga per volta fino a trovare l'istruzione che genera l'errore.

Facci sapere...
Ciao

kierkegaard Profilo | Newbie

commentando solo il 2° try/catch in questo modo:

public class ServerWS { String url; String user; String password; String driverName = "com.mysql.jdbc.Driver"; Statement stmnt; Connection conn = null; ResultSet rs; String titolo,descrizione; public String chiamata(String query) { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } url = "jdbc:mysql://localhost/miodatabase"; user = "user"; password = "pass"; try { conn = (Connection) DriverManager.getConnection(url,user,password); } catch (SQLException e) { e.printStackTrace(); } /* try { stmnt = (Statement) conn.createStatement(); rs = stmnt.executeQuery(query); while(rs.next()) { //long id = rs.getLong(1); //long id = rs.getLong("thing"); //di ogni riga salvo in thing il valore alla prima colonna della tabella limbs String thing = rs.getString(1); //di ogni riga salvo in thing il valore alla seconda colonna della tabella limbs int legs = rs.getInt(2); //di ogni riga salvo in thing il valore alla terza colonna della tabella limbs int arms = rs.getInt(3); System.out.println(thing + "," + legs + "," + arms); } } catch (SQLException e) { e.printStackTrace(); } */ return "Il Server serverws risponde: " + query; } }

il programma va rispondendomi "il Web service ha risposto: Il Server serverws risponde: select * from limbs".

Commentando invece in questo modo mi da questo errore: "errore: l'invocazione del WS è fallita. java.lang.reflect.InvocationTargetException.".

public class ServerWS { String url; String user; String password; String driverName = "com.mysql.jdbc.Driver"; Statement stmnt; Connection conn = null; ResultSet rs; String titolo,descrizione; public String chiamata(String query) { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } url = "jdbc:mysql://localhost/miodatabase"; user = "user"; password = "pass"; try { conn = (Connection) DriverManager.getConnection(url,user,password); } catch (SQLException e) { e.printStackTrace(); } try { stmnt = (Statement) conn.createStatement(); rs = stmnt.executeQuery(query); /* while(rs.next()) { //long id = rs.getLong(1); //long id = rs.getLong("thing"); //di ogni riga salvo in thing il valore alla prima colonna della tabella limbs String thing = rs.getString(1); //di ogni riga salvo in thing il valore alla seconda colonna della tabella limbs int legs = rs.getInt(2); //di ogni riga salvo in thing il valore alla terza colonna della tabella limbs int arms = rs.getInt(3); System.out.println(thing + "," + legs + "," + arms); } */ } catch (SQLException e) { e.printStackTrace(); } return "Il Server serverws risponde: " + query; } }

Jeremy Profilo | Guru

Ciao
A questo punto le possibili cause si riducono a:
- Percorso del database errato
- credenziali di autenticazione al database errate.
Ad ogni modo .... cerca di commentarlo/scommentarlo a blocchi più piccoli di come hai già fatto.

Facci sapere...
Ciao

kierkegaard Profilo | Newbie

Ciao e intanto grazie x il supporto!! :)

Ho notato una cosa e non so se è normale, ovvero: commentando ServerWS.java nel modo in cui non da errore cioè così

public class ServerWS { String url = "jdbc:mysql://localhost/miodatabase"; String user = "user"; String password = "pass"; String driverName = "com.mysql.jdbc.Driver"; Statement stmnt; Connection conn = null; ResultSet rs; String titolo,descrizione; public String chiamata(String query) { try { Class.forName(driverName); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { conn = (Connection) DriverManager.getConnection(url,user,password); } catch (SQLException e) { e.printStackTrace(); } System.out.println("Ciao sono il Server serverws, ho ricevuto questa query: " + query); /* try { stmnt = (Statement) conn.createStatement(); rs = stmnt.executeQuery(query); while(rs.next()) { //long id = rs.getLong(1); //long id = rs.getLong("thing"); //di ogni riga salvo in thing il valore alla prima colonna della tabella limbs String thing = rs.getString(1); //di ogni riga salvo in thing il valore alla seconda colonna della tabella limbs int legs = rs.getInt(2); //di ogni riga salvo in thing il valore alla terza colonna della tabella limbs int arms = rs.getInt(3); System.out.println(thing + "," + legs + "," + arms); } catch (SQLException e) { e.printStackTrace(); } */ return "Il Server serverws risponde: " + query; } }

è normale che non mi viene stampata in console la riga relativa a System.out.println("Ciao sono il Server...? Invece quella relativa al return sì.

Jeremy Profilo | Guru

Ciao.
Continuerei a darti supporto volentieri .... se solo sapessi come fare .... ma se ci addentriamo nell'ambiente Java, forse è meglio ch eposti nella sezione adatta.
http://www.dotnethell.it/forum/Javascript-CSS-XHTML-DHTML.aspx

Li saprebbero aiutarti sicuramente meglio di me.

Ciao

kierkegaard Profilo | Newbie

Ciao,

mi scuso per essere "sparito" per un po ma...sono stati giorni frenetici!!
Sono riuscito a risolvere il problema, semplicemente non avevo inserito il .jar del connector-j dentro la cartella lib di axis.

Ringrazio Jeremy per avermi supportato ;) e per il suo aiuto.

Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5