Web Service com Axis2

Desenvolvi um projeto Web Service usando jax-wsdl deu tudo certo, dai tive a ideia de utilizar o Axis2.
Estou enfrentando um problema na parte cliente. Da seguinte maneira tenho no servidor uma classe CarroDAO com o seguinte método,

public List<Carro> listarDisponiveis(){
		Query q = em.createQuery("select c from Carro c where c.status = :status");
		q.setParameter("status","Livre");
		return q.getResultList();
	}

Eu faço a publicação utilizando o ajax2 no servidor, eu consigo acessar pelo url //localhost:8080/ServidorCompanhiaAereaAxis/services/CarrosDAO?wsdl, me mostra o xml,
até ai tudo certo.
A questão esta na parte cliente eu criei um projeto web, dentro dele eu adiciono um Web Service Client, apontando pra url acima, dai ele me gera duas classes a CarrosDAOCallbackHandler, e a CarrosDAOStub.
Mas nao me gera a classe CarrosDAOService como era gerada antes usando o jax-wsdl. Como eu faço pra acessar o método listarDiponiveis() que esta no servidor???

Acho que você quiz dizer Axis2 :smiley:

Tanto no servidor quando no cliente tem as libs necessárias para rodar/se comunicar com o Axis2?

Talvez esse post lhe ajude.

Opa adrielcafe desculpa pelo português…sim, eu adicionei o axis2 na criação do projeto, estou adicionando os jars do mysql, e do jpa.Voce tem algum exemplo de uma aplicação simples ??? Acho que o problema esta em gerar as classes pois testei de outra forma pelo cmd(prompt Comando) deu o comando wsimpor -keep //localhost:8080/ServidorCompanhiaAereaAxis/services/CarrosDAO?wsdl e ele da a seguinte mensagem

Quando eu dava este mesmo comando usando jax-wsdl só dava as mensagens de compiling code.

[quote=Tiago Casanova]Desenvolvi um projeto Web Service usando jax-wsdl deu tudo certo, dai tive a ideia de utilizar o ajax2.
Estou enfrentando um problema na parte cliente. Da seguinte maneira tenho no servidor uma classe CarroDAO com o seguinte método,

public List<Carro> listarDisponiveis(){
		Query q = em.createQuery("select c from Carro c where c.status = :status");
		q.setParameter("status","Livre");
		return q.getResultList();
	}

Eu faço a publicação utilizando o ajax2 no servidor, eu consigo acessar pelo url //localhost:8080/ServidorCompanhiaAereaAxis/services/CarrosDAO?wsdl, me mostra o xml,
até ai tudo certo.
A questão esta na parte cliente eu criei um projeto web, dentro dele eu adiciono um Web Service Client, apontando pra url acima, dai ele me gera duas classes a CarrosDAOCallbackHandler, e a CarrosDAOStub.
Mas nao me gera a classe CarrosDAOService como era gerada antes usando o jax-wsdl. Como eu faço pra acessar o método listarDiponiveis() que esta no servidor???[/quote]

para acessar o web service no cliente você precisa usar essa classe stub. veja esse exemplo:

http://www.eclipse.org/webtools/community/tutorials/BottomUpAxis2WebService/bu_tutorial.html

valeu maior_abandonado pela ajuda, fiz tudo que estava la mas agora da o seguinte erro

minha classe main


package teste;


import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import org.apache.axis2.AxisFault;

import dao.CarrosDAOStub;
import dao.CarrosDAOStub.Carro;
import dao.CarrosDAOStub.ListarDisponiveis;
import dao.CarrosDAOStub.ListarDisponiveisResponse;

public class teste {

	        public static void main(String[] args) {
	                try {
	   
	                        CarrosDAOStub stub = new CarrosDAOStub();
	                        
	                        ListarDisponiveis list = new ListarDisponiveis();
	                        
	                        ListarDisponiveisResponse res = stub.listarDisponiveis(list);
	                        
	                        System.out.println(res.get_return());
	                        
	                } catch (AxisFault e) {
	                        e.printStackTrace();
	                } catch (RemoteException e) {
	                        e.printStackTrace();
	                }

	        }
}

Me parece que da erro na classe util.JPAUtil, essa classe esta no servidor, ai vai o código dela:

package util;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JPAUtil {
	private static EntityManagerFactory entityManagerFactory = Persistence
			.createEntityManagerFactory("jpa01");

	public EntityManager getEntityManager() {
		return entityManagerFactory.createEntityManager();
	}
}

Vale lembra que o banco esta ativo, pois esta funcionando pois testei o metodo listar dentro do servidor e funcionou de boa, e também adicionei dentro do cliente o jar do meu banco. Mysql.

Pessoal resolvi aquele error. Agora esta dando outro erro…

Alguém tem a ideia do que seja isso???

seu método do serviço recebe algum parâmetro?

caso sim, você precisará passa-lo, não está fazendo.

outra coisa que eu fazia, não sei se é necessário, ao chamar o construtor do stub eu passava a string com o endereço do wsdl.

não conheço as exceções, mas a algum tempo quando estava usando o axis 2 fazia desse jeito…

Estou passando da seguinte maneira


public class teste {

	        public static void main(String[] args) {
	                try {
	                	
	                        CarrosDAOStub stub = new CarrosDAOStub();
	                        
	                        Buscar busca = new Buscar();
	                        busca.setId(2);
	                        
	                        BuscarResponse response = stub.buscar(busca);
	                        
	                       System.out.println(response.get_return());       
	                        
	                } catch (AxisFault e) {
	                        e.printStackTrace();
	                } catch (RemoteException e) {
	                        e.printStackTrace();
	                }

	        }
}

Meu método no servidor

[code]
public class CarrosDAO {

private final EntityManager em = new JPAUtil().getEntityManager();

public List<Carro> listarDisponiveis(){
	Query q = em.createQuery("select c from Carro c where c.status = :status");
	q.setParameter("status","Livre");
	return q.getResultList();
}

public Carro buscar(Long id){
	return (Carro) this.em.find(Carro.class,id);
}
[/code]

Estou chamando da maneira certa??

Alguém sabe??? Por favor alguém tem uma luz no final do túnel.

em casa eu vo montar um projetinho de exemplo de web service com axis 2 e cliente e ai te mando por email o projeto no eclipse compactado…

me manda mp com seu e-mail que tendo um tempo eu faço isso (não tenha pressa).

a, quando for usar web service, eu posso até estar falando besteira, mas eu não acho uma boa ideia usar tipos especificos da linguagem, como list por exemplo, por que a tecnologia em questão foi feita para o “serviço” poder ser acessado por qualquer linguagem, fica zuado este tipo de estrutura com tipos especificos assim especialmente se você estiver usando outra linguagem. Se o cliente for apenas em java então é melhor você usar uma tecnologia como RMI ou EJB, que faz ± a mesma coisa porém é mais rápido, mas apenas para a linguagem java.

um passo a passo básico de como criar o web service no eclipse:

[list]baixe o axis 2 de http://axis.apache.org/axis2/java/core/download.cgi e descompacte;[/list]

[list]no eclipse va em window, preferences, la em baixo a opção web services, axis 2 preferences e em axis2 runtime location deixe o endereço da pasta onde descompactou o axis2;
crie um projeto web comum (dinamic web project)[/list]

[list]crie uma classe, dentro dela cada método publico dessa classe será transformado em um serviço na web. Como eu disse la em cima, não é legal usar tipos da linguagem, prefira tipos primitivos, Strings, VOs se for o caso olu arrays de algum destes, por boa prática mesmo;[/list]

[list]clique com o direito do mouse no projeto web do web service, new, vai la no other embaixo, marca web service (na pasta web services);[/list]

[list]do lado direito tem la o projeto que vai ficar o web service, o servidor, a versão do axis, na metade de cima da janela, vão vir opções erradas e você deverá clicar no link e corrigir isso tudo, next até acabar e finish (tem umas opções la de gerar os casos de teste junit, coisas do tipo, nunca usei…).[/list]

[list]inicia o servidor que usou caso não tenha feito isso no meio do next, finish, abre o browser, abra a raiz do projeto, vai ter uma pagina do axis 2 (quando cria o web service, o plugin cria algumas paginas no seu projeto também e adiciona no seu welcome-file-list no web.xml), ai clica no link services e no nome da classe que você criou (que foi transformada em web services). Você está na página do famoso wsdl, copie esse link que será necessário para criar o cliente;[/list]

[list]agora crie outro dinamic web project para ser o cliente.[/list]

[list]clique com o direito nele, new, other, la na pasta web services vai em web service client, ai você precisa informar o endereço do wsdl copiado anteriormente, depois na tela que não mechemos embaixo e corrigimos os valores em cima, fazemos o contrário dessa vez, corrigimos em baixo, na parte do cliente. Next até o final e finish.[/list]

[list]Foram criadas as classes do stub e do CallBackHundler, com nome e pacotes iguais ao informado no ultimo passo, é esse stub que usamos para acessar o web service. Para quem conhece rmi esse stub funciona da mesma forma, você chama o stub e o stub chama o serviço do outro lado e te retorna o resultado. Teremos dentro do stub uma sub-classe representando cada serviço e retorno do serviço. As classes que representam algum serviço vão ter um setter para cada parâmetro do serviço, você deve criar uma instancia do stub (eu costumo usar o construtor que recebe string e passar o endereço do wsdl), criar um objeto dessas subclasses de serviços, acessar todos estes setters(mesmo que seja para passar null) passando os parâmetros e chamar o método no stub com o nome do serviço, passando como parâmetro o objeto do serviço. O retorno será um <nome do serviço>Return, que sempre terá um método get_return que retornará o que o serviço retorna.Este stub só é gerado no eclipse em dinamic web projects mas você pode pegar estas 2 classes geradas e colar em projetos desktop que o acesso ao web service funciona numa boa (desde que você tenha acesso na rede para o web service… obvio).[/list]

abaixo as classes do web services e do cliente que usei nos dois projetos, os projetos em si eu mandei pro nosso amigo e apaguei, nem adianta pedir via mp, se alguém pensar em pedir, peça para ele…rs

[code]package pacote;

public class Calculadora {

public Calculadora() {
	
}

public double somar(double a, double b){
	return a + b;
}

public double subtrair(double a, double b){
	return a - b;
}

public double multiplicar(double a, double b){
	return a * b;
}

public double dividir(double a, double b){
	return a / b;
}

}
[/code]

[code]package pacoteCliente;

import java.rmi.RemoteException;

import org.apache.axis2.AxisFault;

import pacote.CalculadoraStub;
import pacote.CalculadoraStub.Dividir;
import pacote.CalculadoraStub.DividirResponse;
import pacote.CalculadoraStub.Multiplicar;
import pacote.CalculadoraStub.MultiplicarResponse;
import pacote.CalculadoraStub.Somar;
import pacote.CalculadoraStub.SomarResponse;
import pacote.CalculadoraStub.Subtrair;
import pacote.CalculadoraStub.SubtrairResponse;

public class Cliente {

private CalculadoraStub stub;

public Cliente(String endereco) throws AxisFault{
	this.stub = new CalculadoraStub(endereco);
}

public static void main(String[] args) {
	
	Cliente c= null;
			
	try {
		c = new Cliente("http://localhost:8080/AppServidor/services/Calculadora?wsdl");
		double a = 4.7;
		double b = 2.3;		

		System.out.println(c.somar(a, b));
		System.out.println(c.subtrair(a, b));
		System.out.println(c.multiplicar(a, b));
		System.out.println(c.dividir(a, b));
	} catch (AxisFault e) {
		System.out.println("erro ao conectar com o web service");
		e.printStackTrace();
	} catch (RemoteException e) {
		System.out.println("erro ao chamar serviço remoto");
		e.printStackTrace();
	} catch (Throwable e) {
		System.out.println("erro inesperado");
		e.printStackTrace();
	}
	
	
	
}

/**
 * delega o somar para o serviço
 * @return
 * @throws RemoteException 
 */
private double somar(double a, double b) throws RemoteException{
	Somar somar = new Somar();
	somar.setA(a);
	somar.setB(b);
	
	SomarResponse resposta = stub.somar(somar);
	return resposta.get_return();
	
}

/**
 * delega o subtrair para o serviço
 * @return
 * @throws RemoteException 
 */
private double subtrair(double a, double b) throws RemoteException{
	Subtrair subtrair = new Subtrair();
	subtrair.setA(a);
	subtrair.setB(b);
	
	SubtrairResponse resposta = stub.subtrair(subtrair);
	return resposta.get_return();
	
}

/**
 * delega o multiplicar para o serviço
 * @return
 * @throws RemoteException 
 */
private double multiplicar(double a, double b) throws RemoteException{
	Multiplicar multiplicar = new Multiplicar();
	multiplicar.setA(a);
	multiplicar.setB(b);
	
	MultiplicarResponse resposta = stub.multiplicar(multiplicar);
	return resposta.get_return();
	
}

/**
 * delega o dividir para o serviço
 * @return
 * @throws RemoteException 
 */
private double dividir(double a, double b) throws RemoteException{
	Dividir dividir = new Dividir();
	dividir.setA(a);
	dividir.setB(b);
	
	DividirResponse resposta = stub.dividir(dividir);
	return resposta.get_return();
	
}

}
[/code]

duplicado

Parabéns pela explicação maior_abandonado.
Resposta de 2011 e foi útil hoje.