我有以下问题。我在Servlet2.5容器中有一个spring引导配置,它在一个专门的安全上下文/特权操作上下文中手动启动。因此,从spring-boot-legacy提供的内容开始,我实现了自己的ContextLoaderListener并将其连接到web.xml中:
public class SecurityContextLoaderListener extends ContextLoaderListener {
@Override
public void contextInitialized(final ServletContextEvent servletContextEvent) {
SecurityContextAction action = new SecurityContextAction() {
public Object run() throws Exception {
initSpringBoot(servletContextEvent);
return null;
}
};
SecurityContextHelper.runAction(action);所以有一个特殊的非spring安全上下文,它是由我必须部署的底层环境强制执行的。initSpringBoot基本上与spring-boot-legacy提供的相同。
public WebApplicationContext initSpringBoot(final ServletContext servletContext) {
String configLocationParam = servletContext.getInitParameter("contextConfigLocation");
SpringApplicationBuilder builder = new SpringApplicationBuilder((Object[]) StringUtils.tokenizeToStringArray(configLocationParam, ",; \t\n"));
Class contextClass = this.determineContextClass(servletContext);
builder.contextClass(contextClass);
builder.initializers(new ApplicationContextInitializer[]{new ApplicationContextInitializer<GenericWebApplicationContext>() {
public void initialize(GenericWebApplicationContext applicationContext) {
applicationContext.setServletContext(servletContext);
}
}});
WebApplicationContext context = (WebApplicationContext)builder.run(new String[0]);
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, context);
return context;
}现在我的问题是,从长远来看,我必须迁移到Servlet 3.0环境,在这个环境中,spring boot会自动初始化,因此我无法在自己的安全上下文中手动启动spring和Spring boot。有没有办法在Servlet3.0环境中禁用spring/ spring -boot的自动启动,这样我仍然可以在自己的安全上下文中启动整个spring环境?我在源代码中找不到任何由Servlet3.0容器的注释扫描机制触发spring初始化和spring引导初始化的起点。
发布于 2016-02-19 19:31:43
为了让Spring Boot应用程序在Servlet3.0容器中自动启动,您需要向应用程序添加一个SpringBootServletInitializer子类。
有没有办法在Servlet3.0环境中禁用spring/spring-boot的自动启动
是的,不要向您的应用程序添加SpringBootServletInitializer子类。
发布于 2016-02-20 03:38:49
我只想给这个问题加上最后一个答案。
要关闭spring-web自动配置,您肯定必须从spring web中删除SpringServletContainerInitializer及其相关的配置文件。似乎没有任何其他方法。
Spring应该将所有的自动配置机制移动到一个单独的模块中,这样它就不会强制每个人都使用它的自动配置。总是会有一些不起作用的情况(就像我的在容器引导期间强制执行安全上下文)。
无论哪种方式。我使用Maven shade插件删除了ServletContextInitializers和指向初始化器的服务文件。然后,我在自己的安全上下文中使用spring-boot-legacy或从遗留中派生的我自己的启动代码来引导spring。
下面是shade插件的入口:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<configuration>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<filters>
<filter>
<artifact>org.springframework:spring-web</artifact>
<excludes>
<exclude>org/springframework/web/SpringServletContainerInitializer.class</exclude>
<exclude>META-INF/services/javax.servlet.ServletContainerInitializer</exclude>
</excludes>
</filter>
</filters>
</configuration>
</execution>
</executions>
</plugin>
</plugins>然后,诀窍是从spring-boot-web中排除spring-web,并添加您自己的阴影依赖项。这样你就可以摆脱spring-web麻烦的自动启动了。对于bootstrapping,最简单的方法是使用spring-boot-legacy,这也适用于Servlet3.0系统。
https://stackoverflow.com/questions/35502284
复制相似问题