Saltar al contenido

Use la anotación @EventListener en múltiples eventos en Spring

Hola usuario de nuestro sitio, hemos encontrado la solución a tu pregunta, desplázate y la encontrarás a continuación.

Solución:

Es nominalmente fácil crear un detector de eventos que escuche múltiples eventos:

@EventListener(EventA.class, EventB.class)
public doSomething() 
   ...

Pero, obviamente, este enfoque no le da acceso al evento subyacente. Basado en el javadoc para EventListener no parece posible hacer lo que sugieres

Si un método anotado admite un solo tipo de evento, el método puede declarar un solo parámetro que refleje el tipo de evento que se escuchará. Si un método anotado admite varios tipos de eventos, esta anotación puede hacer referencia a uno o más tipos de eventos compatibles mediante las clases
attribute. Consulte el javadoc de clases() para obtener más detalles.

Si el
classes) attribute se especifica con un solo valor, el método anotado puede aceptar opcionalmente un solo parámetro. Sin embargo, si esto
attribute se especifica con varios valores, el método anotado no debe declarar ningún parámetro.

Por lo tanto, no parece haber ningún mecanismo para consumir múltiples eventos y realizar una acción diferente en función del cuerpo de esos eventos. Sin embargo, sugeriría que esto no debería ser necesario, siempre puede registrar eventos específicos @EventListener métodos, y luego simplemente pídales que llamen a un método compartido para realizar cualquier funcionalidad común.

Fuente: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/event/EventListener.html

Desde Spring 4.2, puede usar la subclase en la declaración del método para manejar todos los eventos que extienden esta subclase:

@EventListener
public void handleEvent(ApplicationEvent event) 
  // listen all descendants of the ApplicationEvent

ACTUALIZACIÓN 2020-10-07:
NOTA: La solución a continuación funciona pero contradice la documentación oficial (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/event/EventListener.html#classes–) y puede dejar de funcionar en las próximas versiones de primavera.

También puede reducir la lista de eventos mediante el uso de anotaciones attribute:

@EventListener(ContextRefreshedEvent.class, ApplicationReadyEvent.class)
public void handleEvent(Object event) 
  // listen only ContextRefreshedEvent and ApplicationReadyEvent

¿Por qué no haces algo como esto?

Desde SpringFramework 4.2puedes publicar eventos sin extender ApplicationEvent.

Como respondió, desea escuchar principalmente eventos personalizados. Puedes hacer algo como esto.

Crea una clase Base llamada BaseEvent.

public class BaseEvent 

  private String type;

  public BaseEvent() 

  public String getType() 
    return type;
  

  public void setType(String type) 
    this.type = type;
  

Considere eso como la clase base cada vez que quiera publicar un personalizado Event.

Ahora vamos a crear dos eventos personalizados llamados Example1Event y Example2Event.

Example1Event Clase

public class Example1Event extends BaseEvent 

  private String message;

  public Example1Event() 

  public String getMessage() 
    return message;
  

  public void setMessage(String message) 
    this.message = message;
  

Example2Event Clase

public class Example2Event extends BaseEvent 

  private String message;

  public Example2Event() 

  public String getMessage() 
    return message;
  

  public void setMessage(String message) 
    this.message = message;
  

Su EventListener se vería así.

public class EventReceiver 

  public EventReceiver() 

  @EventListener
  public void receiveEvent(BaseEvent event) 
    String eventType = event.getType();
    if (eventType.equals("example1")) 
      Example1Event example1Event = (Example1Event) event;
      System.out.println(example1Event.getMessage());
     else if (eventType.equals("example2")) 
      Example2Event example2Event = (Example2Event) event;
      System.out.println(example2Event.getMessage());
    
  

Esto funcionará para lo que quieres hacer.

valoraciones y reseñas

Si estás de acuerdo, tienes la libertad de dejar una reseña acerca de qué le añadirías a este tutorial.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *