out 15

CDI no Websphere 8 com JSF 2

Voltando aos posts de tecnologia, nas duas semanas que se passaram estive com um grande problema no trabalho:

Estávamos desenvolvendo uma aplicação utilizando CDI, com JSF 2, rodando no JBOSS  AS 7, tudo funcionando as mil maravilhas. Mas, porém, contudo, no entanto, como diz Joseph Climber –  “Mas a vida é uma caixinha de surpresas” – nosso servidor de desenvolvimento roda Websphere 8 (WAS 8) , que apesar de adotar praticamente as mesmas especificações do JAVA do JBOSS 7, utiliza em sua maioria as implementações  da APACHE(Myfaces para JSF, OpenWebBeans para CDI), enquanto que o JBOSS utiliza as implementações de referência, por exemplo o WELD para CDI e o mojarra para JSF.

Então como fazer funcionar nos 2 ambientes sem ter problemas de compatibilidade? Alguns passos são necessário, primeiro para o JSF:

  • Adicionar ao web.xml :
 
<context-param>
	<param-name>org.apache.myfaces.SERIALIZE_STATE_IN_SESSION</param-name>
	<param-value>false</param-value>
</context-param>

Agora para o CDI é mais complicado, inicialmente, todas as suas classes elegíveis a injeção, por exemplo, todas as classes que você anotou com @named, devem ser serializáveis, enquanto que no JBOSS não é obrigatório, eu diria até que é uma boa prática fazer isso. Além disso, o beans.xml deve ficar dentro de WEB-INF, obrigatoriamente. No JBOSS basta estar em algum lugar do classpath, no WAS 8 não, tem que estar ao lado do web.xml, abaixo de WEB-INF.

Porém isso não é tudo, no nosso caso aqui, nada estava sendo injetado pelo container, só conseguimos resolver isso incluindo a biblioteca de CDI do myfaces no classpath da aplicação, o Myfaces CODI . Um extra sobre o CODI é que ele também possui uma implementação similar ao ViewScope do JSF que funciona para CDI (CDI padrão não possui essa anotação), que é a @ViewAccessScoped

Você pode escolher quais módulos do CODI você deseja utilizar, aqui abaixo segue o código do pom para inserir o CODI completo, na wiki do CODI você encontra esses módulos.

 
    <dependency>
	<groupId>org.apache.myfaces.extensions.cdi.bundles</groupId>
	        <artifactId>myfaces-extcdi-bundle-jsf20</artifactId>
		<version>1.0.5</version>
		<scope>compile</scope>
    </dependency>