首页 > 解决方案 > 多个 ContextLoader* 定义

问题描述

public class SpringMVCWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class[] { LoginApplicationConfig.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return null;
}

@Override
protected String[] getServletMappings() {
    return new String[] { "/" };
}

}

public class Initializer extends AbstractHttpSessionApplicationInitializer {

   public Initializer() {
       super(Config.class); 
   }
}

如何在不进行多个 ContextLoader* 定义的情况下同时使用 SessionManager 和 AbstractAnnotationConfigDispatcherServletInitializer?

标签: spring-mvc

解决方案


在使用 Spring MVC 并初始化多个初始化程序时,我遇到了同样的问题。将两者分成不同的类并用 Spring @Order(value)注释它们

这将首先被初始化。这AbstractAnnotationConfigDispatcherServletInitializer将启动 servlet 应用程序上下文以及根应用程序上下文。

import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

@Order(1)
public class Init extends AbstractAnnotationConfigDispatcherServletInitializer {
  @Override protected Class<?>[] getRootConfigClasses() {
    return new Class[]{Config.class};
  }

  @Override protected Class<?>[] getServletConfigClasses() {
    return null;
  }

  @Override protected String[] getServletMappings() {
    return new String[]{"/*"};
  }
}

这将被注释为@Order(2)This is the second initialisation for Session 初始化类 AbstractHttpSessionApplicationInitializer将确保 servlet 将使用 springSessionRepositoryFilter 来处理负责用 Redis 支持的自定义实现替换 HttpSession 实现的每个请求更多详细信息

import org.springframework.core.annotation.Order;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
import org.springframework.session.web.context.AbstractHttpSessionApplicationInitializer;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;

@Order(2)
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 600)
public class SessionInit extends AbstractHttpSessionApplicationInitializer {
  @Override
  public void onStartup(ServletContext servletContext) throws ServletException
  {
    super.onStartup(servletContext);
  }
}

推荐阅读