我有以下问题。我在servlet 2.5容器中有一个spring boot配置,它在一个专门的安全上下文/特权操作上下文中有一个手动启动。所以从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启动。有没有办法在servlet 3.0环境中禁用spring / spring-boot的自动启动,这样我仍然可以在我自己的安全上下文中启动整个spring环境?在servlet 3.0容器的注释扫描机制触发弹簧初始化和弹簧启动初始化的源代码中,我找不到任何起点。
答案 0 :(得分:0)
要在Servlet 3.0容器中自动启动Spring Boot应用程序,您需要在应用程序中添加SpringBootServletInitializer
子类。
有没有办法在servlet 3.0环境中禁用spring / spring-boot的自动启动
是的,不要在您的应用程序中添加SpringBootServletInitializer
子类。
答案 1 :(得分:0)
只是为此添加最后一个答案。
要打开spring-web自动配置,你必须从spring web中删除SpringServletContainerInitializer及其相关的配置文件。 似乎没有任何其他方式。
Spring应该将所有autoconfig机制移动到一个单独的模块中,这样它就不会对每个人强制执行自动配置。总是会出现无法工作的极端情况(就像我在容器引导期间强制执行安全上下文一样)。
无论哪种方式。我使用Maven shade插件删除ServletContextInitializers和指向初始化程序的服务文件。然后我使用了spring-boot-legacy或者我自己的启动代码,这些代码来自我自己的安全环境中的boot springst。
这是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,这也适用于servlet 3.0系统。