SpringBoot EventListener 不接收事件

问题描述 投票:0回答:3

我的

EventListener
注释没有收到任何 Spring 事件。这是我的代码:

@Component
public class ProxyConfig {

    public ProxyConfig() {
        System.out.println("I can see this in the console");
    }

    @EventListener
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        System.out.println("WON'T WORK :-(");  // FIXME
    }

    @EventListener
    public void test(ApplicationStartedEvent event) {
        System.out.println("WON'T WORK :-(");  // FIXME
    }
}

这是我的

Application
课程:

@SpringBootApplication
public class Application {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(MyApp.class, args);
    }
}

根据https://spring.io/blog/2015/02/11/better-application-events-in-spring-framework-4-2https://solidsoft.wordpress.com/2015/ 09/29/annotation-driven-event-listeners-in-spring-4-2/ 它必须工作,但它仍然没有打印我的“WON'T WORK :-(”字符串:(

有什么想法吗?

谢谢!

java spring spring-boot event-listener
3个回答
12
投票

您正在监听的两个事件都是在应用程序生命周期的早期发布的。

ApplicationStartedEvent
“在 SpringApplication 启动后尽可能早地发送 - 在环境或 ApplicationContext 可用之前,但在注册 ApplicationListener 之后”。

ApplicationEnvironmentPreparedEvent
发布于“当 SpringApplication 启动并且环境首先可用于检查和修改时。”

在这两种情况下,事件发布得太早,无法通过注释和应用程序上下文找到侦听器。正如您所观察到的,您可以使用

spring.factories
来注册您的监听器。或者,您可以使用
SpringApplication
上的 setter 方法。


2
投票

这是一个老问题,但无论如何,对于任何有同样问题的人......

我刚刚在完全相同的问题上浪费了几个小时,我在互联网上搜索并做了无数次测试都无济于事,我尝试用

@EventListener(ApplicationReadyEvent.class)
@PostConstruct
进行注释,但没有任何效果。

我的理念是,当简单的事情不起作用并且互联网也没有帮助时,这意味着你搞砸了一些事情。所以我开始检查我的代码,我发现你犯了和我一样的错误。

您从其他地方复制了示例,或者将原始配置类从

MyApp
更改为
Application
,并且您忘记更改行:

SpringApplication.run(MyApp.class, args);

SpringApplication.run(Application.class, args);

第一行不会执行任何操作,除非

MyApp
也有
@SpringBootApplication
或其他配置注释,第二行将找到
@SpringBootApplication
注释并正确启动Spring Boot应用程序。

顺便说一句,

@EventListener(ApplicationReadyEvent.class)
@PostConstruct
都工作得很好,在Java 17上进行了测试。


0
投票

由于 Spring Boot 在您感兴趣的事件点尚未完成注解处理,因此无法将事件传递给注解的事件监听器。相反,您必须在应用程序启动时手动注册侦听器。

public class ApplicationStartingListener implements ApplicationListener<ApplicationStartingEvent> {
    @Override
    public void onApplicationEvent(ApplicationStartingEvent event) {
        System.out.println("Application is starting");
    }
}

@SpringBootApplication
public class MyApplication {
   public static void main(String[] args) {
      SpringApplication app = new SpringApplication(MyApplication.class);
      app.addListeners(new ApplicationStartingListener());
      app.run(args);
   }
} 
© www.soinside.com 2019 - 2024. All rights reserved.