Top Posts

A hora é agora – Congresso de TI 3ª Edição – Vide

Continue lendo

DBUnit com HSQLDB + Hibernate + maven

Posted by camilolopes | Posted in Agile/Scrum/TDD, BD, Java | Posted on 08-12-2012

0

Olá pessoal!

No post de hoje vamos ver como executar nossos unit tests usando o DBunit com HSQLDB em memória, tendo o Hibernate como framework de persistencia e usando o maven. por que isso tudo? Eu passei por uns problemas chatos de configuração que normalmente não temos quando fazemos testes de cada um desses recursos separados, mas, quando tive que colocar tudo na mesma panela, surgiram uns problemas mais chatos para nós, desenvolvedores, estou falando daquelas exceções de não achar o arquivo, exceções genéricas dos frameworks, que nos faz ficar horas e horas googlando, etc.

lets go..

O que vou considerar?

Que você já conhece Hibernate e conhece o DBunit, porém agora pretende rodar seus testes em um projeto do tipo maven e que você tem dois arquivos hibernate.cfg.xml, um para os testes e outro para a aplicação em si.

O problema

Tudo começou quando, ao executar meus testes, simplesmente recebi aquela velha mensagem: cannot open JDBC Connection. Eu disse “como assim? O hibernate.cfg.xml está lá”. Daí comecei a investigar. Um ponto eu já sabia e publiquei aqui nesse troubleshooting: o maven procura o hibernate.cfg.xml em src/main/resources. E para os testes? Ele procura em src/test/resources. Até parece lógico, mas errei aqui e não coloquei meu arquivo de hibernate.cfg.xml de teste nesse local. Porém, veio outro problema: eu tinha renomeado meu arquivo hibernate.cfg.xml para hibernateTest.cfg.xml. Por que? Simplesmente queria ter essa diferença. E deixava assim a configuração nos meus testes:

 protected IDatabaseConnection getConnection() throws Exception {

conn = new DatabaseConnection(new Configuration().configure(“hibernateTest.cfg.xml”)

.buildSettings().getConnectionProvider().getConnection());

return conn;

}

Simplesmente recebia:


 

Dai o que fiz?

Mudei o arquivo para hibernate.cfg.xml e rodei a aplicação e o resultado:

 

Isso me custou umas 3hrs do meu dia. Infelizmente não fui pesquisar porque com o nome diferente do hibernate o maven não encontrava o arquivo, somente com o nome default.

O arquivo do DBunitTest é o mesmo que vimos nos outros post da série, a única diferença é que temos um projeto do tipo “simple maven project”.

Hibernate.cfg.xml para o HSQLDB

<session-factory>

<property name=”hibernate.connection.driver_class”>org.hsqldb.jdbcDriver</property>

<property name=”hibernate.connection.url”>jdbc:hsqldb:mem:db</property>

<property name=”hibernate.connection.username”>sa</property>

<property name=”hibernate.dialect”>org.hibernate.dialect.HSQLDialect</property>

<property name=”hibernate.show_sql”>true</property>

<property name=”hibernate.hbm2ddl.auto”>create-drop</property>

<mapping class=”com.camilolopes.qa.model.dao.bean.Account”/>

</session-factory>

 

Configuração do pom.xml Adicione as dependencias abaixo:

<dependency>

<groupId>hsqldb</groupId>

<artifactId>hsqldb</artifactId>

<version>1.8.0.10</version>

</dependency>

<dependency>

<groupId>javassist</groupId>

<artifactId>javassist</artifactId>

<version>3.12.1.GA</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>org.hibernate</groupId>

<artifactId>hibernate-core</artifactId>

<version>3.6.10.Final</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>org.dbunit</groupId>

<artifactId>dbunit</artifactId>

<version>2.4.8</version>

<type>jar</type>

<scope>compile</scope>

</dependency>

 

Crie um bean e um teste para persistir o objeto:

Bean

@Entity

@Table(name=”account”)

public class Account {

@Id

@GeneratedValue

@Column(name=”ID”)

private Long id;

@Column(length=20,name=”TYPE”)

private String type;

}

Test

A classe de test deverá estar assim, e omitir o que não mudou do outro arquivo, como a conexão e o load do .xml.

public DBUnitTest() {

try {

session = getSessionFactory().openSession();

getDataSet();

} catch (Exception e) {

e.getMessage();

}

}

public static SessionFactory getSessionFactory() {

sessionFactory = new Configuration().configure().buildSessionFactory();

return sessionFactory;

}

@Test

public void testSave(){

session.beginTransaction();

Account account = new Account();

account.setType(“USER”);

session.save(account);

}

Enfim, é isso ai. Caso precise rodar seus unit tests com maven + hibernate + hsqldb, sem ter dor de cabeça com arquivo de configuração, essa foi a solução que encontrei.

Abracos, see ya!!

Java WebServices com BD

Posted by camilolopes | Posted in AngularJS | Posted on 04-11-2012

0

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