SeamFramework.orgCommunity Documentation

Capítulo 18. Servidores de aplicação e ambientes suportados pelo Weld

18.1. Utilizando Weld com o JBoss AS
18.2. GlassFish
18.3. Servlet containers (como o Tomcat ou Jetty)
18.3.1. Tomcat
18.3.2. Jetty
18.4. Java SE
18.4.1. Módulo CDI SE
18.4.2. Inicializando aplicações CDI SE
18.4.3. Thread Context
18.4.4. Configurando o Classpath

Se você está usando JBoss AS 6.0, nenhuma configuração adicional é necessária para usar Weld (ou CDI para este caso). Tudo que você precisa fazer é tornar sua aplicação em um bean archive adicionando META-INF/beans.xml ao classpath ou WEB-INF/beans.xml à raiz web!

O Weld também está embutido no GlassFish a partir da V3 e posteriores. Já que o GlassFish V3 é a implementação de referência da Java EE 6, ele deve suportar todas as funcionalidades da CDI. Qual a melhor maneira para que o GlassFish suporte estas funcionalidade do que usar Weld, a implementação de referência da JSR-299? Apenas empacote sua aplicação CDI e implante.

Enquanto a JSR-299 não requer suporte a ambientes servlet, o Weld pode ser utilizado em qualquer contêiner Servlet, como o Tomcat 6.0 ou Jetty 6.1.

O Weld pode ser usado como uma biblioteca de aplicação web em um contêiner Servlet. Você deve colocar weld-servlet.jar dentro do diretório WEB-INF/lib relativo à raiz web. weld-servlet.jar é um "uber-jar", significando que ele empacota todas as partes do Weld e CDI necessárias para rodar em um contêiner servlet, para sua conveniência. Alternativamente, você pode usar seus jars componentes. Uma lista de dependências pode ser encontrada no arquivo META-INF/DEPENDENCIES.txt dentro do artefato weld-servlet.jar.

Você também precisa especificar explicitamente o servlet listener (usado para iniciar o Weld e controlar a interação com as requisições) no web.xml:


<listener>
   <listener-class
>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener
>

Como o Tomcat, o Jetty possui um JNDI somente leitura, assim o Weld não pode vincular automaticamente o BeanManager. Para vincular o BeanManager ao JNDI no Jetty 6, você deve preencher WEB-INF/jetty-env.xml com o seguinte conteúdo:


<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
   "http://jetty.mortbay.org/configure.dtd">
<Configure id="webAppCtx" class="org.mortbay.jetty.webapp.WebAppContext">
   <New id="BeanManager" class="org.mortbay.jetty.plus.naming.Resource">
      <Arg
><Ref id="webAppCtx"/></Arg
> 
      <Arg
>BeanManager</Arg>
      <Arg>
         <New class="javax.naming.Reference">
            <Arg
>javax.enterprise.inject.spi.BeanManager</Arg
> 
            <Arg
>org.jboss.weld.resources.ManagerObjectFactory</Arg>
            <Arg/>
         </New>
      </Arg>
   </New>
</Configure
>

O Jetty 7 foi movido para a Fundação Eclipse; se você está usando o Jetty 7 coloque o seguinte conteúdo em seu WEB-INF/jetty-env.xml:


<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
   "http://www.eclipse.org/jetty/configure.dtd">

<Configure id="webAppCtx" class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="BeanManager" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg
> <Ref id="webAppCtx"/> </Arg>
        <Arg
>BeanManager</Arg>
        <Arg>
            <New class="javax.naming.Reference">
                <Arg
>javax.enterprise.inject.spi.BeanManager</Arg>
                <Arg
>org.jboss.weld.resources.ManagerObjectFactory</Arg>
                <Arg/>
            </New>
        </Arg>
    </New>
</Configure
> 

Assim como no Tomcat, você precisa torná-lo disponível em sua implantação, acrescentando isto ao final do web.xml:


<resource-env-ref>
   <resource-env-ref-name
>BeanManager</resource-env-ref-name>
   <resource-env-ref-type>
      javax.enterprise.inject.spi.BeanManager
   </resource-env-ref-type>
</resource-env-ref
>

Note que o Jetty não possui suporte já existente a um javax.naming.spi.ObjectFactory como o Tomcat, assim é necessário criar manualmente o javax.naming.Reference para envolvê-lo.

O Jetty somente permite que você vincule entradas em java:comp/env, assim o BeanManager estará disponível em java:comp/env/BeanManager

O Weld também suporta injeção em Servlet no Jetty 6. Para habilitar isto, adicione o arquivo META-INF/jetty-web.xml com o seguinte conteúdo em seu war:


<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
   "http://jetty.mortbay.org/configure.dtd">
<Configure id="webAppCtx" class="org.mortbay.jetty.webapp.WebAppContext">
   <Call class="org.jboss.weld.environment.jetty.WeldServletHandler" name="process">
      <Arg
><Ref id="webAppCtx"/></Arg>
   </Call>
</Configure
>

Em adição a uma integração melhorada da pilha Java Enterprise, a especificação "Contexts and Dependency Injection for the Java EE platform" também define um framework de injeção de dependência em estado da arte e typesafe, o qual pode se comprovar útil em uma ampla variedade de tipos de aplicação. Para ajudar desenvolvedores tirar vantagem disto, o Weld fornece um meio simples de ser executado no ambiente Java Standard Edition (SE) independentemente de qualquer API da Java EE.

Quando executando no ambiente SE as seguintes funcionalidades do Weld estão disponíveis:

Beans EJB não são suportados.

Aplicações CDI SE podem ser inicializadas das seguintes maneiras.

Para adicionar flexibilidade, CDI SE também vem com uma API de inicialização que pode ser chamada dentro de sua aplicação para inicializar a CDI e obter referências para os beans e eventos de sua aplicação. A API consiste em duas classes: Weld e WeldContainer.

public class Weld

{
   /** Boots Weld and creates and returns a WeldContainer instance, through which
    * beans and events can be accesed. */
   public WeldContainer initialize() {...}
   /** Convenience method for shutting down the container. */
   public void shutdown() {...}
}
public class WeldContainer

{
   /** Provides access to all beans within the application. */
   public Instance<Object
> instance() {...}
   /** Provides access to all events within the application. */
   public Event<Object
> event() {...}
   /** Provides direct access to the BeanManager. */
   public BeanManager getBeanManager() {...}
}

Aqui está um método main da aplicação de exemplo que usa esta API para inicializar um bean do tipo MyApplicationBean.

public static void main(String[] args) {

   WeldContainer weld = new Weld().initialize();
   weld.instance().select(MyApplicationBean.class).get();
   weld.shutdown();
}

Alternativamente a aplicação poderia ser iniciada ao disparar um evento personalizado que, então, seria observado por um outro simples bean. O seguinte exemplo dispara MyEvent na inicialização.

public static void main(String[] args) {

   WeldContainer weld = new Weld().initialize();
   weld.event().select(MyEvent.class).fire( new MyEvent() );
   weld.shutdown();
}