Web Service

Olá amigos,

Sou novo no forum e estou com um problema enorme.
Sou iniciante em Java, ou seja, apanhando muito ainda e me foi solicitado fazer um Web Service que será consumido por uma aplicação php.
Foi solicitado que o mesmo fosse desenvolvido em java pois é uma linguagem free.
Pelo que li no forum uma boa maneira de desenvolver é utilizando tomcat + axis.
Instalei tudo e fiz um pequeno teste e funcionou, porém, agora eu “travei” pois preciso fazer um webservice que receba parametros, acesse o banco de dados e retorne os dados para a aplicação php.
Estou procurando material na internet, mas encontro somente exemplos basicos como o que fiz e não estou conseguindo dar continuidade ao projeto que tem que estar operando até a próxima semana.
Será que alguém teria algum material ou sabe onde posso encontrar um exemplo parecido com o que preciso, pois como sou leigo, até conseguir desenvolver por meios próprios vai ser complicado.

Desde já agradeço,

Eu consegui fazer um exemplo utilizando vetores para retornar os dados, porém, no xml de resultado as colunas ficam com as tags iguais.
Tem como eu gerar um xml com o resultset, tendo as colunas do sql como nome das tags?

Grato,

Só complementando,

O que eu estou precisando é que o xml gerado seja nesse estilo:

<cliente>
<nome>Jose</nome>
<endereco>rua</endereco>
</cliente>
<cliente>
<nome>Maria</nome>
<endereco>Avenida</endereco>
</cliente>

olha vou te dar um conselho, da uma estuda em
protocolo SOAP estuda um pouco como funciona web service em java,

isso vc tira umas horinhas e fica craque… :slight_smile:

Use o Xtream:
http://xstream.codehaus.org/tutorial.html

XStream xstream = new XStream();
List<Cliente > clientes= new ArrayList<Cliente >();
while (rs.next()) {
    Cliente cliente = new Cliente();
    cliente.setNome(rs.getString("nome"));
    ...
    clientes.add(cliente);

}
String result = xstream.toXML(cliente);

Crie os getters e setters referentes ao seu objeto pronto seu xml está montado.

:smiley:

Pedrosa,

Eu achei interessante esse Xstream, fiz um exemplo dentro do eclipse e funcionou perfeitamente, porém, quando transformo o .java em .jws no axis, está dando erro justamente quando vou utilizar o bean que criei.
Tem algum segredo pra ele localizar o bean quando transformo em webservice?
As duas classes estão no mesmo diretório mas ele não consegue localizar.
Os erros ocorrem nas seguintes linhas:

  1. List<Pessoa> pessoas = new ArrayList<Pessoa>();

  2. Pessoa pessoa = new Pessoa();

Line 34, column -1: cannot find symbol
Line 34, column -1: cannot find symbol
Line 38, column -1: cannot find symbol
Line 38, column -1: cannot find symbol

Segue meu código Pessoa.java

public class Pessoa 
{ 
    private String id_pessoa;
    private String nome; 
     
    public Pessoa()  
    { 
         
    } 
	
	public String getId_Pessoa()
	{
		return id_pessoa; 
	} 
	
	public void setId_Pessoa(String id_pessoa)
	{
		this.id_pessoa = id_pessoa;
	} 	
	
	public String getNome()
	{
		return nome; 
	} 
	
	public void setNome(String nome)
	{
		this.nome = nome;
	}


} 

Nunca usei assim com axis, aqui no projeto implementamos com o Xfire:

http://xfire.codehaus.org/Quick+Start

Fazendo as configurações normais sua classe já se torna um webservice, desde que esteja mapeada no arquivo services.xml.

E no lado do cliente basta consumir dessa forma:

public String getClientes() throws Exception {
	URL url = new URL("http://servidor:8080/SuaAplicacao/services/Servico?wsdl");
	Client cliente = new Client(url);
	Object[] resultado = cliente.invoke("metodoWS",new Object[]{par1,par2,par3});//caso existam
	return resultado[0].toString();
}

Agora transforme sua String em objeto novamente:

XStream xstream = new XStream();
//esse alias deve ser igual a classe do server
xstream.alias("clientes", Cliente.class);
Cliente  cliente = (Cliente ) xstream.fromXML(getClientes());		

Essa é minha classe de teste que virou webservice no axis (JdbcExemploXstream.jws)

import java.sql.*;

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

import com.thoughtworks.xstream.XStream;

public class JdbcExemploXstream
{
	public String Clientes(String args) throws SQLException
	{
		try
		{
			DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
		}
		catch(Exception e)
		{
			 System.out.println("ERRO NO CARREGAMENTO DO DRIVER DO BANCO DE DADOS = " + e.getMessage());
		}

		Connection conn = null;
		Statement stmt = null;
		
		try
		{
			conn = DriverManager.getConnection("jdbc:oracle:thin:@SERVER:1521:USER", "SENHA", "acesso");

			stmt = conn.createStatement();
			ResultSet resu = stmt.executeQuery("select ID_PESSOA, RAZAOSOCIAL from PESSOA where ID_PESSOA in (" + args +") order by ID_PESSOA");

			XStream xstream = new XStream(); 
			List&lt;Pessoa&gt; pessoas = new ArrayList&lt;Pessoa&gt;(); 

			while (resu.next()) 
			{
				Pessoa pessoa = new Pessoa(); 
			    pessoa.setId_Pessoa(resu.getString(1));
			    pessoa.setNome(resu.getString(2)); 
			    
			    pessoas.add(pessoa); 
			   
			} 
			
		    return xstream.toXML(pessoas);	          
                
		}
		catch(SQLException e) 
		{ 
			 System.out.println("ERRO = " + e.getMessage()); 
		}
		return null;
	}
	
}

Seu bean esta preparado para receber uma pessoa, receba também um array:

private List<Pessoa> pessoas;	
public List<Pessoa> getPessoas() {
	return pessoas;
}
public void setPessoas(List<Pessoa> pessoas) {
	this.pessoas = pessoas;
}

E na parte onde carrega tente assim:

XStream xstream = new XStream();  
xstream.alias("pessoas", Pessoa.class);
List<Pessoa> pessoas = new ArrayList<Pessoa>(); 
Pessoa pessoa;
while (rs.next()) { 
    pessoa = new Pessoa();  
    pessoa.setId_Pessoa(resu.getString(1)); 
    pessoa.setNome(resu.getString(2));  
    pessoas.add(pessoa);  
} 
pessoa.setPessoas(pessoas);
String result = xstream.toXML(pessoa);
Pessoa p = (Pessoa ) xstream.fromXML(result);
for(Pessoa p1: p.getPessoas()){
   System.out.println(p1.getId());
   System.out.println(p1.getNome());
}

Antes de tentar consumir o servico tente navegar pelo objeto conforme meu exemplo, depois se preocupe com o webservice.

Vou verificar esse XFire e ver se consigo utilizá-lo.
Qualquer coisa peço help novamente.
Obrigado pela ajuda.

Cara… vale a pena ler SOA e WebServices em Java de Cleuton Sampaio. Esclarece muitas coisas.
Apesar de ser muito por gosto de cada um, prefira o XFire ao Axis(é meio sadomasoquista). Se possível veja o JAX-WS da Sun que integrado ao Netbeans é muito bom.

------------- Links que podem ajudá-lo ----------------
Introdução JAX-WS 2.0 com JAVA 6 (Web Services)
PARTE 1
http://java.sun.com/developer/technicalArticles/J2SE/jax_ws_2/

PARTE 2
http://java.sun.com/developer/technicalArticles/J2SE/jax_ws_2_pt2/

SOA - Service-oriented architecture
http://www.guj.com.br/posts/list/15/65073.java#342679

Iniciando no SOAP com AXIS APACHE
http://www.javafree.org/content/view.jf?idContent=106

Abraços.

Alguém sabe onde posso encontrar um tutorial legal sobre XFIRE.

Tem esse no DevMedia fazendo seus web services pegarem fogo com XFIRE, mas estou tendo algumas dificuldades, acho que devia detalhar mais a parte de configuração, etc…

Por exemplo, devo configurar algo mais no [color=blue]web.xml[/color] além da servlet do XFIRE?

No arquivo [color=red]service.xml[/color], configuro os meus webservices, mas em que lugar na minha app web deve ficar esse arquivo? WEB-INF !!!

Gostaria de um tutorial mais completo um pouco se possivel, preciso desenvolver um web service para realizar consultas, executar history procedures, etc…

A comunicação com webservices, será através de páginas desenvolvidas em PHP.

Desde já agradeço.

[quote=Heider Matos]Alguém sabe onde posso encontrar um tutorial legal sobre XFIRE.

Tem esse no DevMedia fazendo seus web services pegarem fogo com XFIRE, mas estou tendo algumas dificuldades, acho que devia detalhar mais a parte de configuração, etc…

Por exemplo, devo configurar algo mais no [color=blue]web.xml[/color] além da servlet do XFIRE?

No arquivo [color=red]service.xml[/color], configuro os meus webservices, mas em que lugar na minha app web deve ficar esse arquivo? WEB-INF !!!

Gostaria de um tutorial mais completo um pouco se possivel, preciso desenvolver um web service para realizar consultas, executar history procedures, etc…

A comunicação com webservices, será através de páginas desenvolvidas em PHP.

Desde já agradeço.[/quote]

Se vc vai começca rum projeto do zero, aconselho a não usar o XFire e utilizar logo o APACHE CXF, é uma espécie de evolução do XFire com outros projetos do mesmo tipo.

abraços

Ok, vou seguir seu conselho… já havia lido algo do tipo, no site do XFire.

Você sabe onde posso encontrar material do CFX, além do site oficial.

duas coisas:
1 - mudar a extensão da sua classe java p/ jws e copia-la p/ o axis sovai funcionar se sua classe utilizar somente tipos nativos do java, como os primitivos, String, Date e etc. por isso não esta funcionando, pq vc tem uma referencia a um bean que vc criou.
vc vai precisar criar registrar esses novos tipo no arquivo wsdd.
2 - não use Collections como retorno do seu WS. Algumas linguagens não conhecem esse tipo de dado. utilize arrays.

[]'s