Lanzar Eventos mediante Objetos JAVA

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

  • fdw2.0/fundeweb2.0/gt/modificaciones_jboss_seam/nueva_forma_lanzar_eventos.txt
  • Última modificación: 02/08/2018 08:52
  • por JUAN MIGUEL BERNAL GONZALEZ