【问题标题】:Incorporating Redis/Spring Session into my application prevents me from deploying the app将 Redis/Spring Session 合并到我的应用程序中会阻止我部署应用程序
【发布时间】:2019-01-14 18:03:34
【问题描述】:

我正在尝试将 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.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) 在 org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:629) 在 org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1839) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

我从中得出的是,我现在包含的类(可能在 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.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1311) 在 org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1299) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1158) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) 在 org.apache.http.pool.AbstractConnPool.closeExpired(AbstractConnPool.java:558) 在 org.apache.http.impl.conn.PoolingClientConnectionManager.closeExpiredConnections(PoolingClientConnectionManager.java:302) 在 org.ektorp.http.IdleConnectionMonitor$CleanupTask.run(IdleConnectionMonitor.java:52) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 在 java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

我是否遗漏了任何可能导致此错误的内容?

【问题讨论】:

标签: spring-mvc redis spring-session


【解决方案1】:

如果您使用web.xml 引导您的网络应用程序,那么您不应该使用AbstractHttpSessionApplicationInitializer,而是使用传统的基于 XML 配置的方法。

您可以查看 Spring Session 的参考文档中提供的 Redis HttpSession with XML config guide。 你的 Spring 配置应该包含

【讨论】:

    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多