Olá,
Estou tendo problemas ao consumir um Web Service.
Primeiramente eu quero dizer que tenho acesso tanto à aplicação quanto ao Web Service.
Estou utilizando o Apache Axis2 como servidor e a aplicação está sendo desenvolvida em J2ME.
Vamos ao que interessa.
Meu Web Service é composto por uma classe chamada ?DBConnect?. Dentro dela há alguns métodos, dentre eles:
Faz a conexão com o banco de dados.
public String connect(String banco, String user, String senha) {
try {
Class.forName("com.ibm.db2.jcc.DB2Driver");
String connecturl = "jdbc:db2://localhost:50001/"+ banco;
con = DriverManager.getConnection(connecturl, user, senha);
return "Sucesso";
} catch (ClassNotFoundException ex) {
return "Erro, classe não encontrada" + ex.getMessage();
} catch (SQLException e) {
return "SQL Exception: "+ e.toString();
}
}
Efetua uma consulta.
public int[] executa(String coluna) {
try {
stmt = con.createStatement();
res = stmt.executeQuery("select "+coluna+" from MEDIDAS order by datahora desc fetch first 20 rows only");
int[] dados = new int[20];
int i=0;
while(res.next()) {
int dado = res.getInt(coluna);
dados[i] = dado;
i++;
}
return dados;
} catch (SQLException ex) {
return new int[] {0};
}
}
E faço um outro teste.
public String nome(String nome) {
return "O nome eh: " + nome;
}
O código completo do WS pode ser encontrado aqui!
Após publicar o Web Service, eu consigo gerar o seguinte WSDL em http://IP_ADDRESS:8080/axis2/services/DBConnect?wsdl:
Veja AQUI (pdf).
Ao acessar o endereço http://IP_ADDRESS:8080/axis2/services/DBConnect/connect?banco=bd&user=user&senha=pass e executar um método do WS no browser, eu recebo a seguinte resposta:
<ns:connectResponse>
<ns:return>Sucesso</ns:return>
</ns:connectResponse>
Ao acessar o endereço http://IP_ADDRESS:8080/axis2/services/DBConnect/executa?coluna=tensaoae executar um método do WS no browser, eu recebo a seguinte resposta:
<executaResponse>
<return>108</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
<return>109</return>
</executaResponse>
Ao acessar o endereço http://IP_ADDRESS:8080/axis2/services/DBConnect/connect/nome?nome=Faccin e executar um método do WS no browser, eu recebo a seguinte resposta:
<ns:nomeResponse>
<ns:return>O nome eh: Faccin</ns:return>
</ns:nomeResponse>
Vocês podem ver que no browser eu consigo receber as respostas normalmente, porém na minha aplicação, as respostas enviadas pelo ?return? só funcionam caso esteja no seguinte formato (somente texto):
return "abcdefghijklmnopqrstuvwxyz";[/code]
caso contrário o valor retornado é nulo.
A estrutura da minha aplicação é a seguinte (Veja o código completo [url=http://www2.unijui.edu.br/~luis.faccin/J2ME/arquivos/application.pdf]AQUI[/url]!)
[code]package Monitoramento;
import??
import dbconnect.DBConnect;
import dbconnect.DBConnect_Stub;
public class GraficoTFA extends Canvas implements Runnable {
Vars??
/*private int[] vetorTemporario = new int[10];*/
public GraficoTFA() {
Criar o gráfico??
Runnable run = new Runnable() {
public void run() {
//STUBs
DBConnect stub = null;
try {
stub = new DBConnect_Stub();
} catch (Exception e) {
System.out.println("Não conseguiu criar o DBConnect_Stub()");
}
//Conexão com o servidor
try {
String con = stub.connect("GAIC", "db2inst1", "gaic02");
System.out.println("Conexão stub.connect: " + con);
} catch (Exception e) {
System.out.println("Erro stub.connect: " + e.getMessage());
}
while (parar == false) {
try {
nome = stub.nome("Faccin");
} catch (Exception e) {
System.out.println("Exception?");
}
System.out.println("Nome---: " + nome);
try {
Thread.sleep(500);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
Define os dados do gráfico.......
repaint();
}
}
};
(new Thread(run)).start();
}
// stop Thread
public void parar() {
parar = true;
}
public void run() {
/*while (run){
try {
} catch (Exception e) { //InterruptedException
e.printStackTrace();
}
}*/
}
protected void paint(Graphics g) {
Desenha o gráfico;
}
protected void keyPressed(int keyCode) {
Teclas pressionadas??.
}
}
}
Outro exemplo que estou utilizando:
Se eu chamar o método a seguir:
try {
String con = stub.connect("bd", "user", "pass");
System.out.println("Conexão stub.connect: " + con);
} catch (Exception e) {
System.out.println("Erro stub.connect: " + e.getMessage());
}
Eu receberei a resposta ?Sucesso!? e no console do NetBeans será exibido:
Agora veja este outro exemplo quando eu chamo o método ?nome? e envio algum nome por parâmetro:
try {
nome = stub.nome("Faccin");
} catch (Exception e) {
}
E eu mandar mostrar no console através do comando
A resposta será nula, como a seguir:
Nome---: O nome eh: null
Uncaught exception java/lang/NullPointerException.
Notem que o texto ?O nome eh:? faz parte da resposta do WS, portanto Strings passam e os outros valores não passam.
O que eu preciso fazer é receber os valores do método ?executa?, nem que seja um valor de cada vez, para que eu possa gerar gráficos a partir desses valores…
Muito obrigado pela atenção de todos!
abração