Usando Spring Core com múltiplos projects

Olá Pessoal,

O post hoje é bem rápido e a ideia é compartilhar com vocês um problema comum quando temos mais de um projeto com dependência e precisamos usar o applicationContext que está em outro projeto.  São coisas que a gente não decora e que normalmente faz uma vez a cada novo projeto e que certamente esquecemos com o passar do tempo. E se algum livro fala sobre o assunto, certamente nem damos atenção à esse detalhe, pois estamos ansiosos em querer meter a mão na massa.

lets go…

 

Contexto

Recentemente tive que criar um projeto com module do maven. Veja a estrutura para ficar mais claro: 

—parent

—core

—web

–dependecy of core

 

Com o desenho simples acima estou dizendo que tenho um projeto parent (pai) que tem dois filhos: core e web. E o filho web depende do projeto core. 

No projeto core temos o back-end da aplicação, ou seja, regras de negócio e persistência vão estar nesse projeto. O projeto web vai cuidar do front-end. É nele que teremos o controller, os arquivos .html, xhtml, jsp, js etc. 

Então na prática o projeto web tem um .jar do projeto core: 

<dependency>

<groupId>com.handson.core</groupId>

<artifactId>xxx-core</artifactId>

<version>1.0.0</version>

</dependency>

 

Até aqui tudo bem. Nenhum problema, certo? 

Como falei, o projeto core tem o applicationContext do Spring, já que é lá que fazemos IoC, dizemos para o spring cuidar da sessionFactory etc. 

E qual o problema?

Quando precisamos usar o ApplicationContext no web. Esse é o problema. O código a seguir não vai funcionar quando aplicação subir:

 

 @Controller

@Path(“/user”)

public class UserController {

@Autowired

@Qualifier(“userServiceImpl”)

private UserService userService;

//código omitido

}

 

Por que não vai funcionar? Porque o applicationContext está dentro de .jar de outro projeto e ao subir a aplicação precisamos dizer isso para web.xml. Uma forma simples  é criar um arquivo applicationContext em web e importar o que temos no applicationContext no projeto core. Portanto, crie um app-context.xml em resource do projeto web:

 

springprojectwebresource

E no arquivo app-context que está no projeto web, faça isso:

<beans xmlns=”http://www.springframework.org/schema/beans”

xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=”http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-2.5.xsd”> 

<import resource=”classpath*:/META-INF/app-context.xml”/>

</beans> 

Esse caminho acima é porque o arquivo no projeto core está assim:

springappcontextcore

 

Agora no arquivo web.xml no projeto xx-web deixe assim:

 springwebxml

Assim, ao subir a aplicação o arquivo que está dentro do .jar do projeto core será carregado. E no import que fizemos anteriormente dizemos para importar esse arquivo para o contexto da aplicação web que está sendo carregada. 

Pronto. Salve as alterações e execute mvn install. Suba a aplicação. Se o Spring não conseguir fazer o @Autowired ele irá reclamar logo que subir. Mas o esperado é que não tenha problemas. 

Abraços! Vou ficando por aqui. Espero que tenham gostado da dica de hoje.

Validando campos com JSF

 

olá Pessoal, hoje o post é dedicado para quem está aprendendo JSF e pretende usar os recursos de validação de campo do proprio  framework. Perguntas comuns sobre validação: como validar um email? Como validar um campo número? É isso que veremos, claro que mostrarei um pequeno exemplo “motivador”, vai de você criar outras validações para seu formulário. Observe que é algo bem simples e funcional. E para aqueles que  estão estudando para antiga SCJP e acham que regex é algo somente para certificação, Vejam nesse post o poder que regex tem. No post tem um link para “testador de expressões regex online”. Muito show, já tem até alguns exemplos prontos tais como: validação de IP, telefone etc.

lets go…

Preparando o ambiente

Certifique-se que você tem os arquivos .jars necessário para rodar JSF. Confira nos posts a seguir quais os arquivos que vc precisa. Sem falar que usar Jboss tools seria uma boa ideia. Para o nosso exemplo usaremos o plugin no Eclipse Jboss tools para suporte à JSF. Também não pode esquecer que nosso application server  será  o Tomcat, se ainda não instalou/configurou veja no exemplo abaixo.

Desenvolvimento

    1. Com o Jboss tools configurado e Eclipse aberto crie um novo JSF Project.

    2. Em WebContent crie uma página .jsp que redirecione para uma página chamada formulario.jsp. Mas, lembre-se que no seu arquivo index.jsp o code fica assim:

    3. Feito isso, vamos agora codificar nosso formulário em JSF. Para isso crie uma página em jsp com suporte JSF em WebContent chamando de formulario.jsp. Veja abaixo como criar uma página caso tenha esquecido:

    4. Abaixo temos nossa página em JSF. O uso de immediate=true em cada campo é para quando aparecer a mensagem de validação a pagina atual não seja processada, ou seja, ela não vai para a página seguinte enquanto você não atender os requisitos da validação.

    5. Agora crie uma página em .jsp que exiba uma mensagem qualquer. Pois, ela somente será exibida quando as validações da pagina do formulário forem válidas. Nos colocamos nessa página uma mensagem: Mensagem enviada com sucesso!

    6. Feito isso, precisamos criar nosso bean e controller. Então crie um package chamado br.com.bean e nele crie uma classe Java chamada de Usuario.java e deixe conforme abaixo:

  1. Agora crie um package br.com.controller e nele crie uma classe chamada Controller. É essa classe que será responsável por controlar nossa aplicação. Ela que diz aonde o usuário vai parar depois de uma determinada ação. Deixe conforme abaixo:

  2. Vá no arquivo face-config.xml e crie um ManageBean para a classe Controller conforme a imagem abaixo:

  3. Agora vamos adicionar as rules para navegação com as pages. Clique em Navigation Rules e a direita add. Veja abaixo como ficou:

  4. Precisamos apenas configurar o Navigation Cases. Veja:

  5. Uma explicação básica: “Quando vinher a uma mensagem chamada ‘sucesso’ da página formulario.jsp, favor de ir para a pagina mensagem.jsp”.

  6. Agora precisamos criar uma classe que vai validar os campos do nosso formulário, que nesse caso será apenas e-mail e idade. Para isso precisamos implementar uma interface JSF que vai nos auxiliar no processo. É a interface Validator. Para isso crie um package br.com.validator e uma classe EmailValidar e informe que essa classe implementa a interface Validator. Veja meu exemplo abaixo:

  7. Agora deixe sua classe conforme abaixo. E para não perder o costume, explicação está nos comentários.

  8. Agora vamos validar o campo idade, onde é permitido apenas digito. Crie a classe IdadeValidar.java e implemente o método Validator.

  9. Feito isso precisamos apenas informar para o nosso face-config.xml que usaremos nosso validador nesta aplicação. Veja como fazer isso:

  10. Faça o mesmo para o validator idade.

  11. Damos um nome ao validador e informamos a classe que tem a validação, o nome é requirido pois é ele que vamos usar no form.

  12. Agora vá na sua página que contém o formulário e deixe os campos email e idade conforme o código abaixo.

Testando Aplicação

  1. Salve as alterações. Se o tomcat estiver rodando, dar um stop e em seguida um start. E veja aplicação rodando. No nosso caso vamos rodar dentro do próprio Eclipse. Para isso a perspectiva que estamos usando é JavaEE depois clique com o botão direito em cima do projeto e vá em Run >> Run as >> Run on Server.

Vou ficando por aqui e espero que tenham gostado do post. Simples e básico.

See you next post! 😀

JNDI com Hibernate – Ambiente de Test

Olá Pessoal,

No post de hoje, vou apresentar como usar JNDI dentro do seu arquivo hibernate.cfg.xml dentro de um ambiente de teste. Em outro post falarei como usar em um ambiente de produção e ver que fica mais fácil realizar mudanças nas conexões de modo mais fácil, uma vez que normalmente o ambiente de teste possui configurações levemente diferente do ambiente de produção desde nome do usuário, até o path do BD.

Lets go…

Starting/Nosso Cenário

Eu já falei aqui no blog sobre pool de conexão no TomCat e JNDI, porém não falei como usar o JNDI dentro do Hibernate.

Aqui veremos isso com um framework bem utilizado no mercado que é o Hibernate.

Mas, a pergunta que você pode está fazendo: “Camilo, por que eu usaria isso?”, “Qual a diferença na pratica?”

Como sempre gostei de ser mais pratico e menos teorico, eu também tive essa dúvida rs. Porém, descobrir a grande produvidade quando tive 6 projetos diferentes para Produção e sempre quando tinhamos um release, era fato de esquecer de mudar o hibernate.cfg.xml, para as conexões de produção, fora que toda vez já era um saco, porque tinha que configurar sempre no ambiente de desenvolvimento antes de enviar para prod.

Enfim, na pratica você só vai configurar em um lugar as config de conexão, em um único arquivo e mais nada. E o melhor, quando for pra PRODUÇÃO, veremos que lá temos outro arquivo JNDI só para PROD, que normalmente não tem porque mudar com frequência. E nos desenvolvedores precisamos apenas saber o JNDI correto, e o administrador do Servidor que se vire lá com as configs, do arquivo de conexão em produção. Isso é extremamente importante, trabalhei em um projeto do qual nos desenvolvedores não tinhamos acesso as senhas, pw de produção, somente os administradores, para nos o que importava era apenas o path do JNDI e mais nada. Para quem trabalha fazendo todos os papeis (isso lembra meu tempo de freelance rs) desenvolvedor,administrador, DBA, isso parece ser estranho, mas em projetos grandes que participei na IBM , não é assim que funciona. Desenvolvedor é desenvolvedor,Testador é testador e por ai vai. E em ambiente teste você tem até acesso ao BD, PW etc. Mas, em produção. Not.

Hoje estarei limitado ao ambiente de teste, porque no ambiente de produção há algumas mudanças significativas e quero deixar o post focado à um assunto.

Nosso projeto

Criei um projeto muito simples, pois a funcionalidade está no uso de JNDI com Hibernate em teste. Não passa de um projeto com JSF + Hibernate. Porém,vc pode configurar isso em qualquer projeto com Hibernate para que ele funcione com JNDI.


Primeiro passo:

É configurar o arquivo web.xml do seu projeto com o nome do JNDI que deseja, pode ser o nome do seu cachorro, da sua namorada, o que você quiser.

<resource-ref>

<res-ref-name>jdbc/lpjava</res-ref-name>

<res-type>javax.sql.DataSource</res-type>

<res-auth>Container</res-auth>

</resource-ref>

Segundo passo:

Após ter configurado o web.xml, informando que a conexão para o BD estará naquele path. Vamos configurar o nosso JNDI, com os dados de conexão. Em ambiente de teste, vamos configurar o arquivo context.xml que está na pasta Server do Eclipse. É nele que vai estar as config locais. Insira dentro da tag Context o Resource abaixo:

<Resource auth=“Container”

name=“jdbc/lpjava”

driverClassName=“com.mysql.jdbc.Driver”

maxActive=“20” maxIdle=“10” maxWait=“-1”

type=“javax.sql.DataSource”

url=“jdbc:mysql://localhost/apptestes”

password=“lpjava”

username=“camilolopes”

validationQuery=“SELECT 1”

testOnBorrow=“true”

testWhileIdle=“true”

timeBetweenEvictionRunsMillis=“10000”

minEvictableIdleTimeMillis=“60000” />

Observe que informamos o nome do JNDI, que este tem referencia.

Terceiro passo:

Feito isso, vamos informar ao Hibernate que ele vai usar uma conexão JNDI, para o Hibernate o que importa é o path, se amanha você muda a senha de conexão vai precisar alterar apenas o arquivo context.xml que está na pasta Server dentro do Eclipse, lembrando que isso em ambiente de teste. Abaixo como ficou meu arquivo hibernate.cfg.xml

<hibernate-configuration>

<session-factory name=“hibernate/SessionFactory”>

<property name=“hibernate.connection.datasource”>java:/comp/env/jdbc/lpjava</property>

<property name=“hibernate.current_session_context_class”>thread</property>

<property name=“hibernate.transaction.factory_class”>org.hibernate.transaction.JDBCTransactionFactory</property>

<property name=“hibernate.dialect”>org.hibernate.dialect.MySQL5InnoDBDialect</property>

<property name=“hibernate.jdbc.batch_size”>0</property>

<mapping class=“br.com.camilolopes.bean.TUsuario”/>

</session-factory>

</hibernate-configuration>

Quem usa o Hibernate ou está começando vai ver que não temos mais a property para o password ou user, uma vez que há uma referencia para um path, onde este tem referencia para um arquivo (context.xml) onde está de fato nossa conexão.

Finalizando

Teste sua aplicação, mande executar e faça uma persistencia, porem não deixe de verificar se já deu um start no banco de dados, se todos os .jars referente ao Hibernate estão no projeto e no caso do Eclipse olhe se está fisicamente na pasta lib do projeto.

Vou ficando por aqui, espero que tenham gostado do post.

Abracos, see ya guys!!! 🙂

Problem project facet java version 6.0 Eclipse

Olá Pessoal,

Hoje vou falar de um pequeno problema que tive com o Eclipse & Facet, foi uma experiencia meia chata, pois gastei horas. Tive que fazer uma migração de máquina, e lá vai eu instalar todo ambiente de desenvolvimento no novo laptop. Preparar o ambiente é rápido e fácil, porem os problemas começam quando começamos a importar os projetos para o Eclipse. Então neste post vou apresentar um probleminha que tive e tirou meu sossego e acho que alguem pode passar um dia, então terá a solução…

Lets go…

A situação

Vc está todo feliz, pois já instalou o seu servidor (no meu caso tomcat 6), java JDK, banco de dados, IDE (eclipse), Jboss tools instalado e agora quer importar os projetos para o “novo” Elipse. Faz a devida importação do projeto , porem ao tentar rodar recebe a mensagem a seguir:

project facet java version 6.0 is not supported

erroreclipsetom

Ai vc louco,perdido, desesperado:

– remove o TomCat e reinstala

– cria um novo workspace e testa um projeto novo e tudo funciona, menos com o projeto que foi importado

– ver configurações de variáveis de ambiente etc

Mas nada de funcionar. E aonde está o problema?

Solução

Bem, o problema é que precisa configurar o projeto para JDK 1.5 e o facet também para a versão Java 5. Para isso, clique com o botão direito no projeto >> Properties e deixe conforme a imagem abaixo:

facetjava5

Observe que mudei em Project Facets a version do Java para 5. E verifique se o Java Compiler está a versão 1.5. Salve e teste o projeto.

Vou ficando por aqui, espero que tenham gostado da dica.

Abracos, see you!!

Projetos com RedMine

Olá Pessoal,

O post desta semana é algo bem diferente dos demais. Vou falar um pouco sobre RedMine. Quem conhece?

Até algumas semanas não conhecia a tecnologia, já tinha usado algo bem semelhante para gerenciamento de projetos, tais como: OpenProject, Grant. Apesar dos recursos dessas tecnologias serem legais, mas eu queria algo um pouco diferente, algo que pudesse acessar remotamente. Foi quando em uma conversa com Edson Gonçalves, veio a recomendação da tecnologia.

Vamos conhecer…

lets go..

Mas, por que usar RedMine?

Tenho usado RedMine para gerenciar meus projetos IT. Com RedMine, crio as tarefas que precisam e quando devem ser concluída e informo quem tem que fazer. O destinatário da tarefa recebe um email de notificação do trabalho a ser feito e quando este deve ser iniciado, pode-se mudar o status da task e manter todo o time atualizado. Informar quantos % já foi concluído, outro desenvolvedor, testador pode inserir um comentário, há um log de atualização no ticket que foi aberto. E ainda a ferramenta dar suporte ao nosso idioma, isso ajuda aos times, aonde o segundo idioma pode ser um problema.

Mais algumas funcionalidades:

  • – posso importar informações do meu Gantt/OpenProject;
  • – posso usar um controle de versão como Subversion em sincronização com a ferramenta. Assim que sempre uma nova tag, ou um branch for atualizado no meu controle de versão vou ter isso atualizado no projeto;
  • – pode-se adicionar arquivos(.doc, .pdf etc) em um ticket;
  • – informar o nível de prioridade que tal tarefa deve ser concluída.;
  • – ao fechar o ticket informar quantas horas foram gastas;
  • – ao abrir um ticket informar quanto tempo previsto levará para ser implementado;
  • – informar quem pode ter acesso a um determinado ticket. (toda equipe? Ou somente os desenvolvedores?) Por exemplo, há tickets que somente os gerentes e engenheiros tem acesso, por serem informações confidenciais do projeto e não cabe o programador/desenvolvedor saber delas.
  • – Dar para medir as horas já gastas no projeto e assim prever se haverá OverTime;
  • – podemos gerenciar N projetos no mesmo ambiente RedMine. O melhor que não há limitações para criação de projetos .

Abaixo temos alguns printscreen que criei de um projeto apenas para o post. Quem tiver interesse pode testar a tecnologia no próprio site redmine.org basta se cadastrar e ver realmente como é simples e mais produtivo usar RedMine para controle dos seus projetos ou ciclo de desenvolvimento.

“Fico feliz quando eu abro um projeto e vejo o que foi feito nos dias anteriores e o que há para ser feito no dia seguinte e ainda o que está atrasado”. Essa é a sensação.

Acredito que a ferramenta não chega substituir Project Manager da Microsoft ou o RTC da IBM, mas entre custo e benefícios é excelente. E para ter a mesma rodando de forma remota com custo x beneficios.Bastar ter um domínio e comprar uma hospedagem no integrator.com.br.

img1pagebeginredmine

Aqui temos a pagina inicial do RedMine, uma vez que o login/senha estavam OK.

projectblogredmine

Criando um projeto.

emailredmine

Aqui configuramos para que as notificações por email funcione. Nunca habilitei.

developer

Adicionando um novo membro ao time.

repositorioredmine

Configurando o redmine com um controle de versão. Ou seja, se uma tag foi cortada vc vai poder acompanhar tudo daqui. E melhor que dar suporte aos mais usados no mercado.

ticketstatusredmine

Aqui vc configura os status que serão usados na criação de uma tarefa.

gant

Cronograma do projeto, e o melhor pode exportar em pdf.

contaredmine

Configurando sua conta.

calendar

Calendário das atividades, olha a legenda no final.

Vou ficando por aqui espero que tenham gostado do post.

Abracos, guys! See you next post.