gpt4 book ai didi

java - session 范围的 bean 未实例化

转载 作者:行者123 更新时间:2023-11-30 04:06:51 26 4
gpt4 key购买 nike

我想创建一个 session 范围的 bean 来监视 HTTP session 的激活和钝化。该 bean 非常简单:

package my.log;

import javax.servlet.http.HttpSessionActivationListener;
import javax.servlet.http.HttpSessionEvent;

import org.apache.log4j.Logger;

public class SessionLoggingListenerBean implements HttpSessionActivationListener {
private final Logger LOG = Logger.getLogger(this.getClass());

public SessionLoggingListenerBean() {
LOG.info("SessionLoggingListenerBean starting");
}

public void init() {
LOG.info("SessionLoggingListenerBean init");
}

public void sessionDidActivate(HttpSessionEvent event) {
LOG.info("Session " + event.getSession().getId() + " activated");
}

public void sessionWillPassivate(HttpSessionEvent event) {
LOG.info("Session " + event.getSession().getId() + " will passivate");
}
}

应用程序上下文中的 Bean 定义:

 <bean id="sessionLoggingListenerBean" class="my.log.SessionLoggingListenerBean" scope="session" init-method="init" lazy-init="false"/>

使用此配置,此类中没有任何日志,即使是构造函数或 init() 方法也是如此。显然,Spring 并没有创建这个 bean。
通过反复试验,我检查 Spring 是否在另一个 bean 需要时实例化这样的 bean,例如由用户界面使用。还有其他(更好)的方法吗?这是 Spring 的一个错误吗?使用的Spring版本:2.0.8。

最佳答案

HttpSessionActivationListenerjavax.servlet.http 的一部分包裹。这应该给您一个提示,它应该由 Servlet 管理。容器。就您而言,您没有注册 Listener与您的ServletContext ,也不通过 web.xmlSerlvetContainerInitializer .

通过web.xml您无法使其同时成为 Spring 和 Servlet 容器管理对象,因此存在这些解决方法,first , second .

如果您使用的是 WebApplicationInitializer ,您可以实例化您的 AnnotationConfigWebApplicationContext ,有SessionLoggingListenerBean创建了 bean,检索它并将其与

一起使用
SessionLoggingListenerBean yourBean = context.getBean(SessionLoggingListenerBean.class);
servletContext.addListener(yourBean);

关于java - session 范围的 bean 未实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20544094/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com