Integrando JSF com Spring Framework

 

O spring framework é uma biblioteca bastante robusta, contem diversos componentes como por exemplo:

·         Remoting

·         Controle de transações declarativo

·         Wrapper para frameworks de mapeamento O/R

·         Uma Hierarquia de exceções consistente para acesso a dados

·         Um framework de AOP bastante funcional

E junto com este monte de recursos, incluíram um framework MVC, que quem já utilizou sabe que não é a 8ª maravilha do mundo, mas eu por exemplo já cheguei a utilizar só pela facilidade de integração e os recursos que o resto do spring framework traz.

Depois cheguei a estudar a integração dele com o WebWork que funciona muito bem, mas o WebWork não é uma especificação do JCP e já houve quebra de compatibilidade entre a versão 1 e a versão 2, o que normalmente não acontece com as especificações da plataforma J2EE, e uma quebra destas pode prejudicar a continuidade, ou pelo menos a evolução de um projeto, ou até mesmo de todos os projetos de uma empresa.

Depois de pensar um pouco a respeito disto, acho que uma boa solução para este tipo de problema, é utilizar Java Server Faces para a programação da interface Web dos meus sistemas, a especificação não é perfeita, mas eles estão indo no caminho certo, esta aumentando o suporte disponível nas melhores IDEs e a nova versão da especificação promete ser muito melhor do que a anterior, mas mantendo a compatibilidade como quase sempre é feito no JCP.

Frente a isto, eu não gostaria de perder todas as outras vantagens do Spring Framework, então sai a procura de uma maneira eficaz de integrar as duas coisas, e as soluções encontradas foram as seguintes:

1 – Utilizar o VariableResolver que vem junto com o spring framework

        É uma abordagem interessante, fácil de configurar, basta configurar o variable resolver na aplicação dentro do faces-config.xml como abaixo.

 

   ...

org.springframework.web.jsf.DelegatingVariableResolver

 

E depois disto acessar qualquer objeto do spring de dentro de qualquer contexto JSF utilizando a mesma EL da JSF, inclusive setando propriedades de Managed Beans com beans do spring de dentro do faces-config.xml, ou utilizando estes primeiros como Managed Beans.

O problema é que um bean do spring não consegue acessar os beans definidos na aplicação JSF, o que as vezes é necessário.

2 – utilizar o projeto jsf-spring disponível em http://jsf-spring.sourceforge.net/

Esta abordagem, a minha preferida, tem quase a mesma facilidade de configuração, mas traz alguns benefícios a mais, como por exemplo permitir que beans do spring acessem beans JSF, inclusive possibilitando definir escopos (request, session e application) para beans do spring, da mesma maneira que para Managed Beans da JSF.

O setup desta abordagem é quase tão fácil quanto a anterior, mas iremos alterar o arquivo web.xml e não o faces-config.xml.

 

de.mindmatters.faces.spring.support.ContextLoaderListener

 

O único problema é que isto pode variar de versão para versão da biblioteca, mas isto não tem efeito nenhum no seu código, por exemplo, na versão anterior, a alteração também era feita no web.xml, mas de uma forma um pouco diferente como se vê a baixo:

 


RequestHandled de.mindmatters.faces.spring.RequestHandledFilter

RequestHandled
/faces/*

 

Qualquer uma das duas abordagens fácil o suficiente para ser transparente para a aplicação, inclusive a mudança de versão.

 

Espero que este pequeno comentário sobre a integração destas duas tecnologias tenha sido útil para alguém, sintam-se a vontade para visitar o meu blog e entrar em contato com duvidas ou sugestões para um próximo mini artigo.

 

 

 

 

Rodrigo Urubatan Ferreira Jardim, tem cerca de 4 anos de experiência com desenvolvimento utilizando java, ao todo 8 anos de experiência nas mais diversas linguagens de programação, possui as certificações SCJP 1.4 e SCWCD 1.4, e trabalha atualmente como arquiteto J2EE na USI Sistemas de Informação (http://www.usiinformatica.com.br) sediada em Porto Alegre/RS, é um dos coordenadores do RSJUG (http://www.rsjug.org) e participa de foruns como o GUJ (http://www.guj.com.br), mantém o blog http://blog.urubatan.com.br e nas horas vagas, normalmente fica praticando downhill com patins inline.