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>

 

jul 17

Adicionando um Datasource Postgresql ao Jboss 7.1

Pra quem usa ou usava jboss 6, era bem simples você adicionar um datasource novo, bastava você copiar o default e modificar as configurações, gravando esse novo arquivo na pasta deploy do seu server. Porém no Jboss 7 é um pouco diferente, e, diria eu, um tanto quanto burocrático.

Primeiramente é necessário baixar os drivers necessários de acordo com seu banco.

Em seguida copie para

jboss-as-7.1.1.Final/modules/org/postresql/main/

O jar baixado.

O jar precisa necessariamente estar embaixo da pasta main. Além disso nesta pasta main também tem que estar um arquivo xml : module.xml com o seguinte conteúdo:

 
<module xmlns="urn:jboss:module:1.1" name="org.postgresql">
    <properties>
        <property name="jboss.api" value="private"/>
    </properties>

    <resources>
        <resource-root path="postgresql-X.X-XXX.jdbcN.jar"/>
    </resources>

    <dependencies>
        <module name="javax.api"/>
    </dependencies>
</module>

Agora abra o arquivo jboss-as-7.1.1.Final/standalone/configuration/standalone.xml  e procure pela tag <subsystem xmlns=”urn:jboss:domain:datasources:1.0″>  . Dentro dela deverá ser adicionado o seguinte conteúdo:

<datasources>
    <datasource jta="false" jndi-name="java:/PostgresDS"
        pool-name="postgres-ds" enabled="true" use-ccm="false">
        <connection-url>jdbc:postgresql://localhost:5432/meu_banco
        </connection-url>
        <driver-class>org.postgresql.Driver</driver-class>
        <driver>postgresql</driver>
        <security>
            <user-name>usuario</user-name>
            <password>senha</password>
        </security>
        <validation>
            <validate-on-match>false</validate-on-match>
            <background-validation>false</background-validation>
        </validation>
        <statement>
            <share-prepared-statements>false</share-prepared-statements>
        </statement>
    </datasource>
    <drivers>
        <driver name="postgresql" module="org.postgresql" />
    </drivers>
</datasources>

Agora… Nada mais a ser feito, fora restartar o jboss, ufa né, bem chatinho criar um datasource a partir da versão 7 do jboss, mas é isso aí.