Olá Pessoal,
Dando continuidade aos post sobre webservice neste ultimo desta série, vamos ver como ter uma aplicação que faz pesquisa no banco de dados e vamos disponibilizar essa pesquisa via webservice. Um cliente nosso, vai consumir essa webservice e conseguir pesquisar em nosso banco, então deixar o “hello world” de lado. Ah, vamos usar o Hibernate framework para fazer a consultar no banco.Outro detalhe, não seguir as melhores praticas para criar DAO genérica, fiz tudo em uma classe, o objetivo aqui não é DAO, Hibernate etc. E sim disponibilizar um web service para que possa ser consumido pelos clientes, que será uma consulta de clientes pelo ID.
Lets go…
Requisitos
- Java 6 ou mais recente
- MySql 5
- Hibernate
Contexto
Se você não entendeu bem o contexto, vou dar um pouco mais de detalhe, antes de começarmos a desenvolver. Vamos ter dois projetos, um que é a nossa aplicação que pesquisa clientes por ID e o outro o projeto do fornecedor que vai consumir a webservice. O nosso banco já está populado com alguns clientes. No nosso caso serão poucos dados apenas o ID e o CPF.
Desenvolvendo
Nosso código será um pouco grande, pois vou incluir parcialmente o código do Hibernate, também vou considerar que já conhece o framework, sendo assim, não irei explicar código que não seja relacionado webservice. Se tem dúvida com o Hibernate, pode visitar nossa categoria aqui no blog e ver o que temos por lá. Certifique-se também que você tem uma tabela no banco populada:
A minha tabela chamei de Cliente.
Crie o projeto Java Project aqui chamei de WSDAO.
Não esqueça de adicionar os .jars do Hibernate & MySQL ao seu projeto.
Vamos começar pelo bean, então crie uma classe cliente conforme abaixo, os getters/setters foram omitidos.
@Table
@Entity
public class Cliente {
@Id
@Column(name=”ID_CLIENTE”)
@GeneratedValue
private int id;
@Column
private long cpf;
//getters/setters omitidos
Agora vamos criar o nosso DAO, para isso crie uma classe conforme abaixo:
public class ClienteDAO {
private final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private final SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
public Session getSession(){
Session session = threadLocal.get();
if (session == null) {
session = sessionFactory.openSession();
threadLocal.set(session);
}
return session;
}
public Cliente getCliente(int id) {
Session session = getSession();
Cliente cliente = new Cliente();
try{
session.beginTransaction();
String hql = “from Cliente where id=:idvalue “;
Query query = session.createQuery(hql );
query.setInteger(“idvalue”, id);
cliente = (Cliente) query.uniqueResult();
}catch (HibernateException e) {
e.printStackTrace();
}finally{
session.close();
}
return cliente;
}
Criando agora o nosso SEI:
@WebService
public interface Service {
@WebMethod
Cliente getCliente(int id);
}
Criando SIB
@WebService(endpointInterface=”br.com.camilolopes.ws.sei.Service”)
public class ServiceImpl implements Service {
private ClienteDAO clienteDAO = new ClienteDAO();
@Override
public Cliente getCliente(int id) {
return clienteDAO.getCliente(id);
}
}
Publicando o serviço:
public class ClientePublish {
public static void main(String[] args) {
Endpoint.publish(“http://localhost:9876/wscliente”, new ServiceImpl());
}
}
Testando com SOAPUI
Agora precisamos testar, então suba o serviço rodando a classe ClientePublish(Run → as → Java Application ) e em seguida abra o SOAPUI, crie um projeto e passe a url do com o wsdl (no meu caso: http://localhost:9876/wscliente?wsdl)
Ao adicionar url certamente verá o método getCliente a esquerda na tela da esquerda da ferramenta, click no sinal + e dê dois cliques no request1. Sua tela deve ser conforme a image a seguir:
Na tag <arg0>?</arg0> vamos passar o ID do cliente que queremos buscar, então informe os Ids válidos conforme vimos mais cedo na tabela do DB. Vou informar o ID 1 e ele deve retornar o resultado na aba que está a esquerda. Troque a ? por 1 e execute clicando no botão submit request (uma seta verde que está na parte superior da tela)
note: lembre-se que seu serviço deve tá publicado, ou seja, a classe que faz o publish deve tá rodando. No caso do exemplo do post chamei ela de ClientePublish.
O resultado é conforme a imagem a seguir:
Observe que temos o resultado no formato XML a direita. E oque acontece se o ID não existir? Simplesmente não traz nada. :).
Criando o Cliente para Consumir
Agora vamos criar um cliente que vai conseguir esse nosso webservice que faz uma pesquisa no banco de dados pelo ID do cliente. Para ficar claro e separar o projeto webservice do cliente, vamos criar um projeto separado, lembrando que uma vez o serviço publicado este projeto cliente que vai consumir o webservice, não necessariamente precisa ser desenvolvido em Java, poderia ser em .NET, PHP etc.
Step 1
Crie um novo projeto Java, o do post chamei de WSDAOConsumer somente para facilitar o entendimento no post.
note: não crie os packages conforme a imagem acima, apenas o projeto por enquanto, beleza?
Step 2
via prompt de comando acesse o src do projeto
Step 3
import o wsdl para o projeto:
wsimport -keep -p br.ws.cliente http://localhost:9876/wscliente?wsdl
note: Se você não quiser rodar o comando wsimport verifique se a sua IDE dá suporte na importação do wsdl de maneira visual e execute, o resultado será o mesmo. Depender da versão do Eclipse que estiver usando você terá o suporte.
Step 4
crie em um package separado a classe que vai usar as operações do service
public class Consumer {
public static void main(String[] args) {
Service service = new ServiceImplService().getServiceImplPort();
Cliente cliente = service.getCliente(1);
System.out.println(cliente.getId());
System.out.println(cliente.getCpf());
}
}
O resultado é mais simples possível, apenas imprime o resultado no console:
A questão é: “imprime no console, porque o meu projeto é assim, ele usa o prompt para imprimir as coisas que ele consome do web service”.Analise e pense dessa forma com o exemplo acima.Porém, Se fosse um projeto JEE eu poderia exibir isso em uma view JSF em uma tabela ou também não poderia exibir em lugar nenhum, e pegar o resultado do WS e salvar em tabela no meu banco de dados, enfim são N possibilidades que podemos fazer com os dados que estamos consumindo, isso vai está atrelado as regras de negócio do seu projeto. Resolvi trazer essa abordagem, para quem está chegando não ache que para consumir um web service deve rodar em cima de Java Application apenas.
Vou ficando por aqui, espero que vocês tenham gostado dessa série de posts sobre web service.
Abraços, see ya!!