Java WebServices com BD

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!!