Dev & EngARTIGO

Trabalhando com JBoss Weld e JSF 2.0

Olás! 

O framework de desenvolvimento JSF vem ganhando bastante espaço entre desenvolvedores e empresas. A versão 1.2 trouxe bastante melhorias, mas ainda é como se ele tivesse diversos GAPs, por exemplo, por muito tempo utilizei o JBoss Seam para suprir coisas chatas que o JSF 1.2 não provia por padrão.

Não vamos gastar tempo aqui explicando o que é o JBoss Weld; veja abaixo a explicação sobre ele, a partir do site oficial http://seamframework.org/Weld.

Weld is the reference implementation (RI) for JSR-299: Java Contexts and Dependency Injection for the Java EE platform (CDI). CDI is the Java standard for dependency injection and contextual lifecycle management. JSR-299 is a Java Community Process (JCP) standard that integrates cleanly with the Java EE platform. Any Java EE 6-compliant application server provides support for JSR-299 (even the web profile).

Pré-Requisitos

Ter JDK 6 instalada, Maven 2.2.1 ou posterior e um editor à sua escolha. No meu caso, vou utilizar o bom e velho Eclipse.

Criando o projeto Web vazio

Vamos criar nosso projeto base a partir do archetype:generate do maven. Crie o diretório com o nome do seu projeto e execute a seguinte linha de comando:

mvn archetype:generate -DinteractiveMode=n -DarchetypeArtifactId=maven-archetype-webapp -Dversion=0.0.1-SNAPSHOT -DgroupId=br.com.brenooliveira.weld -DartifactId=weld_tutorial

Acredito que você já utilizava o Maven antes e já deve saber que ele não cria todos as pastas necessárias, mas apenas a estrutura mínima. Então ainda precisamos criar as seguintes pastas:

weld_tutorial/src/test<br /><br />weld_tutorial/src/test/java<br /><br />weld_tutorial/src/test/resources<br /><br />weld_tutorial/src/main/java

Configurando o pom.xml

No pom.xml, apenas vamos adicionar as dependências necessárias para que nosso projeto funcione e também vamos configurar um jetty para facilitar nosso desenvolvimento.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><br />	<modelversion>4.0.0</modelversion><br />	<groupid>teste-weld</groupid><br />	<artifactid>weld-tutorial</artifactid><br /><packaging>war</packaging><br />	<version>1.0.0-SNAPSHOT</version><br />	<name>spronline Maven Webapp</name><br />	<url>http://maven.apache.org</url><br /><br />	<repositories><br />		<!-- Adicionamos o Repositório do JBoss para garantia de encontrar as dependências --><br />		<repository><br />			<id>repository.jboss.org</id><br />			<name>JBoss Repository</name><br />			<url>http://repository.jboss.org/maven2</url><br />			<releases><br />				<enabled>true</enabled><br />			</releases><br />			<snapshots><br />				<enabled>false</enabled><br />			</snapshots><br />		</repository><br />	</repositories><br />	<dependencies><br />		<dependency><br />			<groupid>junit</groupid><br />			<artifactid>junit</artifactid><br />			<version>3.8.1</version><br />			<scope>test</scope><br />		</dependency><br /><br />		<!-- Comum --><br />		<dependency><br />			<groupid>javax.enterprise</groupid><br />			<artifactid>cdi-api</artifactid><br />			<scope>provided</scope><br />			<version>1.0-CR1</version><br />		</dependency><br /><br />		<dependency><br />			<groupid>javax.annotation</groupid><br />			<artifactid>jsr250-api</artifactid><br />			<version>1.0</version><br />		</dependency><br /><br />		<dependency><br />			<groupid>javax.faces</groupid><br />			<artifactid>jsf-api</artifactid><br />			<version>2.0.0-RC</version><br />		</dependency><br /><br />		<!-- Especifico para Jetty --><br />		<dependency><br />			<groupid>javax.faces</groupid><br />			<artifactid>jsf-impl</artifactid><br />			<scope>runtime</scope><br />			<version>2.0.0-RC</version><br />		</dependency><br /><br />		<dependency><br />			<groupid>javax.servlet</groupid><br />			<artifactid>jstl</artifactid><br />			<version>1.2</version><br />			<scope>runtime</scope><br />		</dependency><br /><br />		<dependency><br />			<groupid>org.jboss.weld.servlet</groupid><br />			<artifactid>weld-servlet</artifactid><br />			<version>1.0.0-CR1</version><br />			<scope>runtime</scope><br />		</dependency><br /><br />		<dependency><br />			<groupid>org.glassfish.web</groupid><br />			<artifactid>el-impl</artifactid><br />			<version>2.1.2-b04</version><br />			<scope>runtime</scope><br />			<exclusions><br />				<exclusion><br />					<groupid>javax.el</groupid><br />					<artifactid>el-api</artifactid><br />				</exclusion><br />			</exclusions><br />		</dependency><br />	</dependencies><br /><br />	<build><br />		<finalname>weldtutorial</finalname><br /><plugins><br />			<!-- Força compilar em Java 1.6 --><br /><plugin><br />				<groupid>org.apache.maven.plugins</groupid><br />				<artifactid>maven-compiler-plugin</artifactid><br />				<configuration><br />					1.6<br />					<target>1.6</target><br />				</configuration><br />			</plugin><br /><br />			<!-- Embedded Jetty (jetty:run) --><br /><plugin><br />				<groupid>org.mortbay.jetty</groupid><br />				<artifactid>maven-jetty-plugin</artifactid><br />				<configuration><br />					<!-- Coloca um path com um nome mais amigavel --><br />					<contextpath>${build.finalName}</contextpath><br />					<!-- Aqui é onde declaramos BeanManager é contruido.  --><br />					<jettyenvxml>${basedir}/src/test/resources/jetty-env.xml</jettyenvxml><br />					<!-- Para quem já trabalhou com JRebel sabe o quanto isso é bom. Um ótima feature do Jetty --><br />					<scanintervalseconds>3</scanintervalseconds><br />				</configuration><br />			</plugin><br />		</plugins><br />	</build><br /></project>

Configurando nosso web.xml

Com o JSF 2 ainda precisamos configurar algumas coisas no web.xml, o que se tornou opcional é aquele arquivo faces-config.xml, então no web.xml:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"><br />  <display-name>Weld Tutorial</display-name><br /><br />  <context-param><br /><param-name>javax.faces.DEFAULT_SUFFIX</param-name><br /><param-value>.xhtml</param-value><br />	</context-param><br />	<servlet><br />		<servlet-name>Faces Servlet</servlet-name><br />		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class><br />		<load-on-startup>1</load-on-startup><br />	</servlet><br />	<servlet-mapping><br />		<servlet-name>Faces Servlet</servlet-name><br />		<url-pattern>*.jsf</url-pattern><br />	</servlet-mapping><br /><br />	<!-- Configuração de alguns parametros do Weld para o Jetty --><br /><listener><br /><listener-class>org.jboss.weld.environment.servlet.Listener</listener-class><br />	</listener><br /><br />	<resource-env-ref><br />		<description>Object factory for the CDI Bean Manager</description><br />		<resource-env-ref-name>BeanManager</resource-env-ref-name><br />		<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type><br />	</resource-env-ref><br /></web-app>

Também é necessário indicar ao Weld para inicializar o DI (Dependency Injection). Para isso, basta criar um arquivo chamado beans.xml dentro da pasta WEB-INF/. A simples presença desse arquivo diz ao container que WEB-INF/classes é um bean deployment archive.

Preparando o Jetty

Para que nosso aplicativo funcione no jetty, precisamos configurar o jetty-env.xml, apenas vamos declarar quem é o nosso injetor de dependências.

<configure id="webAppCtx" class="org.mortbay.jetty.webapp.WebAppContext"><br />	<new id="appManager" class="org.mortbay.jetty.plus.naming.Resource"><br />		<arg><br />			<ref id="webAppCtx"><br />		</ref></arg><br />		<arg>BeanManager</arg><br />		<arg><br />			<new class="javax.naming.Reference"><br />				<arg>javax.enterprise.inject.spi.BeanManager</arg><br />				<arg>org.jboss.weld.resources.ManagerObjectFactory</arg><br />				<arg><br />			</arg></new><br />		</arg><br />	</new><br /></configure>

Escrevendo nosso HelloWorld.java

Quem trabalhou com JSF 1.2 ou versões anteriores com certeza se lembra do quanto era entediante declarar todos os managed-bean; e quem já utilizou o JBoss Seam sabe o quanto é mais simples e também o quanto diminui a quantidade de linhas no faces-config.xml, pois essa configuração de XML é trocada para anotações, muito semelhante a como o JBoss Seam faz, para não falar igual. Então nossa classe HelloWorld.javaJava42 conteúdosNovidades do Java 26 (para desenvolvedores)Dev (Back & Front) · mar 2026Visual Studio Code para Java: o guia completo (dicas, configuração e extensões)Dev (Back & Front) · out 2025Quarkus: Modernizando a linguagem Java para a era da nuvemDev (Back & Front) · nov 2020Ver tudo em Dev (Back & Front) fica:

package br.com.brenooliveira.actions;<br /><br />import java.io.Serializable;<br />import javax.enterprise.context.SessionScoped;<br />import javax.inject.Inject;<br />import javax.inject.Named;<br /><br />@Named<br />@SessionScoped<br />public class HelloWorld implements Serializable {<br /><br />	private static final long serialVersionUID = 6325770734571129423L;<br /><br />	private String text = "Hello World JSF!";<br /><br />	public String getText() {<br />		return text;<br />	}<br />}

Como você pode observar, apenas adicionamos a anotação @Named. Ainda seria possível passar um valor nela, que acabaria definindo o nome do managed-bean.

Escrevendo .xhtml

Criado o nosso managed-bean, vamos chamar o atributo dela em nossa página xhtml.

<?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd"><br /><html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"><br /><h:head><br />	<title>JSF Demo</title><br /></h:head><br /><h:body><br />	<h1>Funcionou?</h1><br />	<h:form><br />		<h:commandButton action="#{helloWorld.doAction}" value="Chamar doAction()" /><br />		<h:commandButton action="#{helloWorld.login}" value="Chamar login()" /><br />	</h:form><br />	<p>My weld-injected bean says: #{helloWorld.text}</p><br /></h:body><br /></html>

Aqui não tem muito segredo, apenas chamamos o atributo de nosso managed-bean.

Executando o nosso projeto

Para executar o projeto, vamos utilizar o jetty. Se você observou no início, nós adicionamos o plugin do jetty para maven, então abra uma linha de comando no diretório do pom.xml e execute a seguinte linha de comando:

mvn war:inplace jetty:run

Depois basta acessar http://localhost:8080/weldtutorial/index.jsf e ver o resultado final.

Até a próxima!

É programador viciado, pós-graduado pela Universidade de São Paulo, e tem trabalhado com desenvolvimento de software há mais de quatorze anos, começando com tecnologias como PHP para Web e migrando para linguagens como Ruby, Java, JavaScript and Go. Atualmente focado no desenvolvimento mobile para Android e iOS, incluindo wearables como smartwatches. Também tem uma grande experiência acumulada com Arquitetura de Software, Micro Services, DevOps, DDD, TDD, BDD e é um entusiasta com metodologias ágeis como Scrum, XP, Lean e Kanban. Atualmente, tem estudado mais movimento de Fintechs, acumulando grande experiência na MoIP e um grande entusiasmado com a criação de ferramentas para recrutamento e seleção.

Ver perfil