spring-mvc - 将 Redis/Spring Session 合并到我的应用程序中会阻止我部署应用程序
问题描述
我正在尝试将 SpringSession 合并到我现有的(非 Spring 引导)应用程序中。我关注了Baeldung,这似乎是最有意义的: https ://www.baeldung.com/spring-session
这是我的 Maven 依赖项:
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
这是我创建的配置代码:
@Configuration
@EnableRedisHttpSession
public class SessionConfig{
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new
JedisConnectionFactory();
jedisConnectionFactory.setHostName("localhost");
jedisConnectionFactory.setPort(6379);
jedisConnectionFactory.setDatabase(1);
return jedisConnectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory());
return template;
}
}
这是扩展 HttpSessionInitializer 的 Initializer 类:
public class Initializer extends AbstractHttpSessionApplicationInitializer {
public Initializer() {
super(SessionConfig.class);
}
}
我的理解是,这创建了一个有效拦截会话并使用 Redis 管理它们的 bean,而不是使用 Java In Memory 会话管理。
然而。我无法部署应用程序,并且在 mt catalina 日志中收到以下错误:
2018 年 8 月 7 日 11:13:24.241 严重 [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart 向类 [org.springframework.web.context.ContextLoaderListener] 的侦听器实例发送上下文初始化事件的异常java.lang.IllegalStateException:无法初始化上下文,因为已经存在根应用程序上下文 - 检查您的 web.xml 中是否有多个 ContextLoader* 定义!在 org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:262) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103) 在 org.apache.catalina.core.StandardContext.listenerStart (StandardContext.java:4751) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5215) 在 org.apache。
我从中得出的是,我现在包含的类(可能在 AbstractHttpSessionApplicationInitializer 中)正在尝试加载与我的 web.xml 中已经声明的 ContextLoaderListener 冲突的应用程序上下文。但是,如果我从 web.xml 中删除该侦听器,那么这也不允许我的应用程序部署。
我的 tomcat 日志中也出现了这个异常,但不确定它是否相关:
2018 年 8 月 7 日 11:14:57.652 信息 [ektorp-idle-connection-monitor-thread-1] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading 非法访问:此 Web 应用程序实例已被停止。无法加载 [org.apache.http.pool.AbstractConnPool$4]。出于调试目的以及尝试终止导致非法访问的线程,会抛出以下堆栈跟踪。java.lang.IllegalStateException:非法访问:此 Web 应用程序实例已停止。无法加载 [org.apache.http.pool.AbstractConnPool$4]。出于调试目的以及尝试终止导致非法访问的线程,会抛出以下堆栈跟踪。在 org.apache 的 org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1311)。
有什么我遗漏的东西可能导致这个错误吗?
解决方案
如果您使用web.xml
引导您的网络应用程序,那么您不应该使用AbstractHttpSessionApplicationInitializer
传统的基于 XML 配置的方法。
您可以查看Spring Session 的参考文档中提供的带有 XML 配置指南的Redis 。HttpSession
您的 Spring 配置应包含
推荐阅读
- android - onesignal 和其他推送通知服务如何在没有 json 配置文件的情况下工作?
- ruby-on-rails - Rails Activestorage 和 S3,存储敏感数据
- javascript - 谷歌饼图中的圆角
- javascript - 如何在嵌套屏幕之间导航并防止返回 React Navigation?
- spring - 在 Spring Boot 中单击提交按钮后结果页面未出现
- java - webstart-maven-plugin 自定义 jnlp 模板变量列表
- postgresql - 在 Postgres SQL 中进行并行处理时出现“错误:无法识别的配置参数“max_parallel_workers_per_gather”
- javascript - 多个查询nodejs mysql
- sql - 两个表之间的递归
- c# - 值不会传递 - 只传递空值,并更新网格中的值