将Redis / Spring Session集成到我的应用程序中会阻止我部署该应用程序

时间:2018-08-07 15:22:14

标签: 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);
    }
}

我的理解是,这将创建一个可有效拦截会话的bean,并使用Redis对其进行管理,而不是使用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)

我是否缺少任何可能导致此错误的信息?

1 个答案:

答案 0 :(得分:0)

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

您可以查看Redis HttpSession with XML config guide,该文档可从Spring Session的参考文档中获得。 您的Spring配置应包含