SeamFramework.orgCommunity Documentation

Capítulo 13. Integración Java EE

13.1. Inyección de recursos de Java EE en un Web Bean
13.2. Llamando a Web Bean desde un Servlet
13.3. Llamada a un Web Bean desde un Message-Driven Bean
13.4. endpoints JMS
13.5. Empaquetamiento y despliegue.

Los Web Beans están totalmente integrados en un entorno de Java EE. Los Web Beans tienen acceso a recursos de Java EE y a contextos persistentes de JPA. Se pueden ser utilizar en expresiones Unificadas EL en páginas JSF y JSP. Pueden ser inyectados en algunos objetos, tales como Servlets y Message Driven Beans, los cuales no son Web Beans.

Todos los Web Beans sencillos y empresariales pueden aprovechar la inyección de dependencia de Java EE utilizando@Resource, @EJB y @PersistenceContext. Ya hemos visto algunos ejemplos de esto, aunque no prestamos mucha atención en el 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;
    
    ...
}

Los @PostConstruct de Java EE y las llamadas de @PreDestroy también son compatibles con todos los Web Beans sencillos y empresariales. El método @PostConstruct es llamado después de realizar toda la inyección.

Hay una restricción para tener en cuenta aquí: @PersistenceContext(tipo=EXTENDIDO) no es compatible con Web Beans sencillos.

Es fácil utilizar un Web Bean desde un Servlet en Java EE 6. Simplemente inyecte el Web Bean mediante campo de Web Beans o Inyección de método inicializador.

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");
        }
    }
            
}

El cliente proxy de Web Beans cuida las invocaciones del método de enrutamiento desde el Servlet a las instancias correctas de Credenciales e Inicio de sesión para la petición y sesión HTTP actuales.

La inyección de Web Beans se aplica a todos los EJB, incluso cuando no están bajo el control del administrador de Web Bean (si fueron obtenidos por el JNDI o inyección utilizando @EJB, por ejemplo). En particular, se puede utilizar inyección de Web Beans en Message-Driven Beans que no sean considerados Web Beans porque no se puede inyectarlos.

Se pueden incluso utilizar enlaces de interceptor de Web Beans para Message-Driven Beans.

@Transactional @MessageDriven

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

Así, la recepción de mensajes es superfácil en un entorno de Web Beans. No obstante, tenga en cuenta que no hay sesión o contexto de conversación disponible cuando se envía un mensaje a un Message-Driven Bean. Sólo los Web Beans @RequestScoped y @ApplicationScoped Web Beans están disponibles.

También es fácil enviar mensajes mediante Web Beans.

Enviar mensajes mediante JMS puede ser bastante complejo, debido al número de objetos diferentes que se tienen que manejar. Para colas tenemos Queue, QueueConnectionFactory, QueueConnection, QueueSession y QueueSender. Para temas tenemos Topic, TopicConnectionFactory, TopicConnection, TopicSession y TopicPublisher. Cada uno de estos objetos tiene su propio ciclo de vida y modelo de hilos de los cuales tenemos que preocuparnos.

Los Web Beans se encargan de eso por nosotros. Todo lo que se necesita es reportar la cola o tópico en web-beans.xml, especificando un tipo de enlace y conexión de fábrica.


<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
>

Ahora podemos inyectar Queue, QueueConnection, QueueSession o QueueSender para una cola, o Topic, TopicConnection, TopicSession oTopicPublisher para un tema.

@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) );
}

El ciclo de vida de objetos JMS inyectados es controlado por el administrador deWeb Bean.

Web Beans no define ningún despliegue especial de archivo. Se puede empaquetar Web Beans en JAR, EJB-JAR o WAR — cualquier ubicación de despliegue en la aplicación classpath. No obstante, cada archivo que contiene Web Beans debe incluir un archivo llamado web-beans.xml en META-INF o en el directorio WEB-INF. El archivo puede estar vacío. Los Web Beans desplegados en archivos que no tienen un archivo web-beans.xml no estarán disponibles para uso en la aplicación.

Para ejecución Java SE, los Web Beans pueden ser desplegados en cualquier lugar en el que los EJB se puedan implementar para ejecución por el contenedor Lite EJB incorporable. De nuevo, cada lugar debe contener un archivo web-beans.xml.