All posts in “Java”

Suri-spring (JSF + Spring + Hibernate)

Olá surinautas!

Muito se discute sobre ferramentas de desenvolvimento e frameworks que auxiliem os desenvolvedores na construção de sistemas. Uma das combinações mais utilizadas pela comunidade é de:

  • JSF;
  • Spring;
  • Hibernate.

A Surittec desenvolveu vários projetos com essas tecnologias e, para facilitar a vida dos desenvolvedores, desenvolveu uma arquitetura que simplificou e reduziu o trabalho dos programadores. Aos que tiverem interesse, o código é aberto e está disponível em Suri-spring.

Esse post tem a intenção de demonstrar um pouco da utilização e das facilidades que essa arquitetura fornece. Outras tecnologias envolvidas no projeto são:

  • Maven: gestão de dependências;
  • Spring Security: autenticação e autorização no acesso aos recursos;
  • PrettyFaces: integração com URLs amigáveis para o JSF.

Estrutura

A arquitetura foi pensada para projetos em três camadas, com View-Controller, Service e DAO. O Suri-spring está organizado da seguinte maneira:

Estrutura

Pacote br.com.suricattus.surispring.framework

Contem as classes com métodos utilitários para cada camada da aplicação:

  • Controller:
    • ControllerSupport: disponibiliza métodos utilitários para as classes de controle da visão. Encapsula vários tratamentos do contexto da Servlet, manipulação de componentes JSF e tratamento de mensagens a serem apresentadas aos usuários. As controllers do sistema devem, prioritariamente herdar dessa classe;
    • AppendBusinessMessages: anotação que especifica classes a serem interceptadas e tratadas pela BusinessExceptionInterceptor;
    • BusinessExceptionInterceptor: configura um interceptor, via Spring AOP, para capturar as mensagens de negócio, BusinessException, e apresenta-las amigavelmente aos usuários. Isso desonera o tratamento de mensagens por parte do programador. Uma vez lançada uma exceção com código conhecido pela Service, a arquitetura trata a internacionalização e apresenta em tela.
  • Services:
    • GenericRetrieveService: classe básica para Services que realizem apenas pesquisa de dados. Sem escopo transacional definido;
    • ServiceSupport: classe que herda da GenericRetrieveService e enriquece com métodos de manipulação (inclusão, alteração e exclusão) de dados. Inicia o escopo transacional, e, por default, realiza o rollback quando alguma Exception for lançada;
    • BusinessException: exceção negocial do sistema, pode ser lançada sem declaração explícita e força o rollback das transações no contexto em que for lançada.
  • DAOs:
    • DaoSupport: suporte para criação de DAOs. Deve ser específica por entidade e com a informação da classe da chave primária dessa entidade. Injeta o entityManager default da aplicação e provê métodos básicos de inclusão, alteração, exclusão e pesquisa de dados.
  • Util: pacote com classes utilitárias para o resto da arquitetura.

Pacote br.com.suricattus.surispring.hibernate

Possui classes que facilitam operações do hibernate como:

  • HibernateProxyExtractor: retirar entidades do proxy do hibernate;
  • HQL: construir queries utilizando o Hibernate Query Language com facilidade.

Pacote br.com.suricattus.surispring.javax.validator

Segue o padrão de validações em java (JSR 303: Bean Validation) com anotações e implementações que permitem validar campos de CPF e CNPJ.

Pacote br.com.suricattus.surispring.jsf

  • converter: conversores frequentemente utilizados pelo JSF. Seu uso reduz o overehead dos controllers e segue o ciclo de vida correto do JSF;
  • exception: integra as mensagens do PrettyFaces com o JSF;
  • facelets: biblioteca de funções necessárias em telas;
  • primefaces.component: sobrescreve alguns componentes do primefaces para melhorar algumas de suas funcionalidades;
  • validator: validadores frequentemente utilizados pelo JSF. Seu uso reduz o overehead dos controllers e segue o ciclo de vida correto do JSF.

Pacote br.com.suricattus.surispring.spring

Especialização de algumas características do Spring para se adaptar a arquitetura, como:

  • contextos de vida de componentes;
  • funções de segurança para serem utilizadas no JSF;
  • esteriótipo para DAO.

Recursos

  • br/com/suricattus/surispring: arquivos de message bundle com mensagens internacionalizadas;
  • META-INF:
    • arquivos XML: arquivos de configuração do JSF, Spring, componentes sobrescritos e bibliotecas personalizadas;
    • resources: recursos a serem utilizados nos componentes JSF.

Mão na massa

Mas de nada adianta todas essas facilidades se não for fácil utiliza-las. Para isso, você precisa fazer apenas duas alterações em seu projeto.

pom.xml (outras dependências do JSF, Spring e Hibernate serão necessárias)

applicationContext.xml

Obs.: na data de lançamento do post, a versão mais atual era a 2.0.5. Certifique-se de utilizar sempre a mais recente e usufruir de suas novidades e correções.

No fim das contas

Este é o resultado de um longo trabalho de refinamento e melhoria de uma arquitetura de software baseada em JSF + Spring + Hibernate, com casos práticos vividos pelo dia a dia da empresa. Pode até ser que essa estrutura ainda não, e talvez nunca, seja exatamente o que você precisa, mas com certeza vale a pena ler e estuda-la um pouco para tentar aproveitar algumas de suas lições e boas práticas.

Sugestões, críticas e relatório de erros serão bem-vindos em nossa página de contato.

Até a próxima!