我有一个自定义的 ServletContextListener 用于初始化和启动 Cron4J 调度程序。
public class MainListener implements ServletContextListener {
@Value("${cron.pattern}")
private String dealHandlerPattern;
@Autowired
private DealMoqHandler dealMoqHandler;
}
如图所示,我正在自动装配侦听器中的一些对象,并希望 Spring 管理侦听器的实例化。我正在使用程序化 web.xml 配置WebApplicationInitializer
,但到目前为止,Listener 没有被自动装配(每当我尝试访问所谓的自动装配对象时都会出现 NullPointerExceptions)。
添加 ContextLoaderListener 后,我已经尝试添加我的客户侦听器,如下所示:
public class CouponsWebAppInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(SpringAppConfig.class);
// Manage the lifecycle of the root application context
container.addListener(new ContextLoaderListener(rootContext));
container.addListener(new MainListener()); //TODO Not working
}
我检查了这些过去的问题Spring - Injecting a dependency into a ServletContextListener and dependency injection servlet listener并尝试在我的侦听器的 contextInitialized 方法中实现以下代码:
WebApplicationContextUtils
.getRequiredWebApplicationContext(sce.getServletContext())
.getAutowireCapableBeanFactory()
.autowireBean(this);
但是,我只是得到以下异常:
Exception sending context initialized event to listener instance of class com.enovax.coupons.spring.CouponsMainListener: java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered?
at org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext(WebApplicationContextUtils.java:90) [spring-web-3.1.1.RELEASE.jar:3.1.1.RELEASE]
在添加我的侦听器之前,如何确保 Spring 已经完成了实例化?