SeamFramework.orgCommunity Documentation
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
.