0

我正在尝试使用最近发布的 Spring Session 库在 Redis 中进行外部会话管理。我正在使用本指南。当我尝试启动服务器时,出现此错误:

SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
java.lang.IllegalStateException: Cannot initialize context because there is already a root application context present - check whether you have multiple ContextLoader* definitions in your web.xml!

我认为这是因为我的 webapp 已经有用于上下文初始化的代码。我宁愿保留该代码。有什么方法可以实现该教程的结果而无需进行额外的上下文初始化?如果我可以自己添加 springSessionRepositoryFilter bean 和相应的过滤器对象,这似乎并不是必需的,但我不知道 Spring Session 代码如何在内部执行此操作。

4

2 回答 2

1

对于 Spring Boot 应用程序,它不需要使用初始化程序类作为 Spring 官方参考: http ://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/guides/boot.html 。

同样使用spring security,您可以查看下面的spring教程: https ://github.com/spring-projects/spring-session/tree/master/samples/javaconfig/security/src/main/java/sample

import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;


public class Initializer extends AbstractHttpSessionApplicationInitializer {

}

如果您想使用 maven 而不是 gradle 进行配置,可以在评论中查看我的答案。希望能帮助到你!

于 2017-02-07T19:50:56.397 回答
0

您需要对现有初始化程序进行的更改应该是最小的。首先,它可能WebApplicationInitializer目前正在实施,应该将其更改为 extend AbstractHttpSessionApplicationInitializer。其次,在您的onStartup方法中,super.onStartup(servletContext)在您现有的初始化代码之后添加。

public class Initializer extends AbstractHttpSessionApplicationInitializer
{
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException
    {
        // existing code

        super.onStartup(servletContext);
    }
}

我知道您不想更改初始化程序,但这是使其工作的一种非常简单的方法。

于 2015-05-07T18:45:16.250 回答