Se ha añadido a JBoss Seam una nueva forma de lanzar y registrar eventos mediante instancias de objetos (clases) JAVA.
La forma tradicional de lanzar eventos en Seam es mediante la clase org.jboss.seam.core.Events, utilizando un String, ejemplo:
if (Events.exists()) { Events.instance().raiseEvent("org.jboss.seam.security.loginSuccessful"); }
y registramos los oyentes (listeners u observers) utilizando el mismo String, ejemplo:
@Observer("org.jboss.seam.security.loginSuccessful") public void miObserver() { // realizar tareas }
o mediante el fichero components.xml, ejemplo:
<event type="org.jboss.seam.security.notLoggedIn"> <action execute="#{redirect.captureCurrentView}" /> </event> <event type="org.jboss.seam.security.loginSuccessful"> <action execute="#{redirect.returnToCapturedView}" /> </event>
Disponible tambien para FundeWeb 1.5.
Con la nueva forma, vamos a utilizar POJOS, que son a al vez, contenedores de propiedades y el identificador del evento en si mismo. Para eso el POJO tiene que implementar la inteface org.jboss.seam.core.EventObject, ejemplo:
package es.um.atica.prueba.events; import org.jboss.seam.core.EventObject; public class PruebaEvent implements EventObject { private String propiedadUno = null; private boolean propiedadDos = false; public PruebaEvent() { } public PruebaEvent( String propiedadUno, boolean propiedadDos ) { this.propiedadUno = propiedadUno; this.propiedadDos = propiedadDos; } public String getPropiedadUno() { return propiedadUno; } public void setPropiedadUno( String propiedadUno ) { this.propiedadUno = propiedadUno; } public boolean isPropiedadDos() { return propiedadDos; } public void setPropiedadDos( boolean propiedadDos ) { this.propiedadDos = propiedadDos; } @Override public String toString() { return "PruebaEvent[P1= " + propiedadUno + ", P2= " + propiedadDos + "]"; } }
para lanzar el evento, utilizamos la clase Events, ejemplo:
public void lanzaEventoSincrono() { log.info( "Entra en lanzaEventoSincrono" ); PruebaEvent event = new PruebaEvent("lanzaEvento", true); if ( Events.exists() ) { Events.instance().raiseEvent( event ); } log.info( "Sale de lanzaEventoSincrono" ); } public void lanzaEventoAsincrono() { log.info( "Entra en lanzaEventoAsincrono" ); PruebaEvent event = new PruebaEvent("lanzaEvento", true); if ( Events.exists() ) { Events.instance().raiseAsynchronousEvent( event ); } log.info( "Sale de lanzaEventoAsincrono" ); }
y registramos los oyentes (listeners u observers) sin utilizar un String, ejemplo:
package es.um.atica.prueba.backbeans; import org.jboss.seam.annotations.Logger; import org.jboss.seam.annotations.Name; import org.jboss.seam.annotations.Observer; import org.jboss.seam.core.Events; import org.jboss.seam.log.Log; import es.um.atica.prueba.events.PruebaEvent; @Name("pruebaEventObject") public class PruebaEventObject { @Observer public void listenerEvento(PruebaEvent event) { log.info( "Entra en listenerEvento: recibido #0", event ); } }
Para este tipo de lanzamiento de eventos, el método oyente (tiene la anotación @Observer) solo puede tener un parámetro, que es el propio evento.
Para registrarlo mediante el fichero components.xml, el String de registro es el que forman la concatnacion del paquete y el nombre de la clase, separados por un '.', ejemplo:
<event type="es.um.atica.prueba.events.PruebaEvent"> <action execute="#{pruebaEventObject.listenerEvento(event)}" /> </event>
donde event, es una variable de contexto accesible por EL. Se puede crear mediante código o mediante la anotación @Out en un componente Seam (las clases que tienen la anotación @Name o declaradar en el fichero components.xml.
— JUAN MIGUEL BERNAL GONZALEZ 02/08/2018 08:08