SeamFramework.orgCommunity Documentation

Capítulo 13. Integração com o Java EE

13.1. Injetando recursos Java EE em um Web Bean
13.2. Invocando um Web Bean a partir de um Servlet
13.3. Invocando um Web Bean de um Message-Driven Bean
13.4. Endpoints JMS
13.5. Empacotamento e implantação

A Web Beans está plenamente integrada ao ambiente Java EE. A Web Beans tem acesso aos recursos Java EE e aos contextos de persistência JPA. Eles podem ser utilizados em expressões EL Unificadas (Unified EL) e em páginas JSF e JSP. Podem até ser injetados em objetos que não são Web Benas, tais como Servlets e Message-Driven Beans.

Todos Web Beans, simples e corporativos (enterprise Web Beans), podem usufruir da injeção de dependência do Java EE utilizando @Resource, @EJB e @PersistenceContext. Nós já vimos vários exemplos disso, embora não demos muita ênfase até o momento:

@Transactional @Interceptor

public class TransactionInterceptor {
    @Resource Transaction transaction;
    @AroundInvoke public Object manageTransaction(InvocationContext ctx) { ... }
    
}
@SessionScoped

public class Login {
    @Current Credentials credentials;
    @PersistenceContext EntityManager userDatabase;
    
    ...
}

As chamadas Java EE @PostConstruct e @PreDestroy também são suportadas para todos os Web Beans simples e corporativos. O método anotado com @PostConstruct é invocado após todas injeções serem realizadas.

Existe uma restrição de que devemos estar conscientes: @PersistenceContext(type=EXTENDED) não é suportada por Web Beans simples.

É fácil utilizar um Web Bean a partir de um Servlet em Java EE : basta injetar o Web Bean usando a injeção de atributos ou de método de inicialização de Web Beans.

public class Login extends HttpServlet {


    @Current Credentials credentials;
    @Current Login login;
    @Override
    public void service(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        credentials.setUsername( request.getAttribute("username") ):
        credentials.setPassword( request.getAttribute("password") ):
        login.login();
        if ( login.isLoggedIn() ) {
            response.sendRedirect("/home.jsp");
        }
        else {
            response.sendRedirect("/loginError.jsp");
        }
    }
            
}

O proxy cliente do Web Bean (Web Beans client proxy) cuida do encaminhamento das invocações dos métodos do Servlet para as instâncias corretas de Credentials e Login para a requisição e sessão HTTP atuais.

Injeção de Web Beans aplica-se a todos EJBs, mesmo quando esses não estão sob o controle do gerenciador do Web Bean (se tiverem sido obtidos por busca direta no JNDI, ou por injeção utilizando @EJB, por exemplo). Em particular, você pode usar a injeção de Web Beans em Message-Driven Beans, que não são considerados Web Beans porque você não pode injetá-los.

Você ainda pode usar bindings de interceptadores Web Beans em Message-Driven Beans.

@Transactional @MessageDriven

public class ProcessOrder implements MessageListener {
    @Current Inventory inventory;
    @PersistenceContext EntityManager em;
    public void onMessage(Message message) {
        ...
    }
            
}

Assim, receber mensagens é super fácil no ambiente Web Beans. Mas, cuidado, pois não existe um contexto de sessão ou conversação disponível quando uma mensagem é entregue a um Message-Driven Bean. Apenas @RequestScoped e @ApplicationScoped Web Beans estão disponíveis.

Também é fácil enviar mensagens usando Web Beans.

O envio de mensagens usando JMS pode ser bastante complexo, devido à quantidade de objetos diferentes que precisamos utilizar. Para filas, temos Queue, QueueConnectionFactory, QueueConnection, QueueSession e QueueSender. Para os tópicos, temos Topic, TopicConnectionFactory, TopicConnection, TopicSession e TopicPublisher. Cada um desses objetos tem seu próprio ciclo de vida e modelo de threads, com que temos de nos preocupar.

A Web Beans cuida de tudo isso para nós. Tudo que precisamos fazer é declarar a fila ou o tópico no web-beans.xml, especificando e associando o tipo de binding e a fábrica de conexão (connection factory).


<Queue>
    <destination
>java:comp/env/jms/OrderQueue</destination>
    <connectionFactory
>java:comp/env/jms/QueueConnectionFactory</connectionFactory>
    <myapp:OrderProcessor/>    
</Queue
>

<Topic>
    <destination
>java:comp/env/jms/StockPrices</destination>
    <connectionFactory
>java:comp/env/jms/TopicConnectionFactory</connectionFactory>
    <myapp:StockPrices/>    
</Topic
>

Agora, podemos injetar a Queue, QueueConnection, QueueSession ou QueueSender para uma fila, ou Topic, TopicConnection, TopicSession ou TopicPublisher em um tópico.

@OrderProcessor QueueSender orderSender;

@OrderProcessor QueueSession orderSession;
public void sendMessage() {
    MapMessage msg = orderSession.createMapMessage();
    ...
    orderSender.send(msg);
}
@StockPrices TopicPublisher pricePublisher;

@StockPrices TopicSession priceSession;
public void sendMessage(String price) {
    pricePublisher.send( priceSession.createTextMessage(price) );
}

O ciclo de vida do objeto JMS injetado é completamente controlado pelo gerenciador do Web Bean.

A Web Beans não define nenhum tipo especial de pacote de implantação. Você pode empacotar Web Beans em JARs, EJB-JARs ou WARs — qualquer localização de implantação do classpath da aplicação. Entretanto, cada arquivo ( JARs, EJB-JARs ou WARs) que contém Web Beans deve incluir um arquivo chamado web-beans.xml no diretório META-INF ou no diretório WEB-INF. O arquivo pode ser vazio. Os Web Beans implantados em pacotes que não possuem o arquivo web-beans.xml não estarão disponíveis para uso na aplicação.

Para execução em ambiente Java SE, Web Beans podem ser implantados em qualquer localização em que EJBs possam ser implantados para execução pelo container EJB Lite embutido (embeddable EJB Lite container). Novamente, cada localização deve conter o arquivo web-beans.xml.