Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot SpringBoot,如何在Servlet3.0环境中手动启动它_Spring Boot - Fatal编程技术网

Spring boot SpringBoot,如何在Servlet3.0环境中手动启动它

Spring boot SpringBoot,如何在Servlet3.0环境中手动启动它,spring-boot,Spring Boot,我有以下问题。我在Servlet2.5容器中有一个spring引导配置,在专门的安全上下文/特权操作上下文中有一个手动启动。因此,从spring boot legacy提供的内容开始,我实现了自己的ContextLoaderListener,并将其连接到web.xml中: public class SecurityContextLoaderListener extends ContextLoaderListener { @Override public void contextInitia

我有以下问题。我在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与SpringBoot遗留版提供的基本相同

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;
}
public WebApplicationContext initSpringBoot(最终ServletContext ServletContext){
字符串configLocationParam=servletContext.getInitParameter(“contextConfigLocation”);
SpringApplicationBuilder=new SpringApplicationBuilder((对象[])StringUtils.tokenizeToStringArray(configLocationParam,,;\t\n”);
Class contextClass=this.determineContextClass(servletContext);
builder.contextClass(contextClass);
builder.initializer(新的ApplicationContextInitializer[]{new ApplicationContextInitializer(){
公共void初始化(GenericWebApplicationContext应用上下文){
applicationContext.setServletContext(servletContext);
}
}});
WebApplicationContext上下文=(WebApplicationContext)builder.run(新字符串[0]);
servletContext.setAttribute(WebApplicationContext.ROOT\u WEB\u APPLICATION\u CONTEXT\u属性,CONTEXT);
返回上下文;
}

现在我的问题是,从长远来看,我必须迁移到Servlet3.0环境中,在那里spring引导会自动初始化,因此我无法在自己的安全上下文中手动启动spring和spring引导。有没有办法在Servlet3.0环境中禁用spring/spring引导的自动启动,这样我仍然可以在自己的安全上下文中启动整个spring环境?我在源代码中找不到由servlet 3.0容器的注释扫描机制触发spring初始化和spring引导初始化的任何起点。

对于在servlet 3.0容器中自动启动的spring引导应用程序,您需要向应用程序添加
SpringBootServletInitializer
子类

有没有办法在Servlet3.0环境中禁用spring/spring引导的自动启动


是的,不要在应用程序中添加
SpringBootServletInitializer
子类。

只需添加最后一个答案即可

要启动SpringWeb自动配置,您必须从SpringWeb中删除SpringServletContainerInitializer及其关联的配置文件。 看来没有别的办法了

Spring应该将所有的自动配置机制移动到一个单独的模块中,这样它就不会对每个人强制执行自动配置。总会有一些不起作用的极端情况(比如我的情况,它在容器引导期间强制执行安全上下文)

不管怎样。我使用Maven shade插件删除ServletContextInitializers和指向初始值设定项的服务文件。然后我在自己的安全上下文中使用了SpringBootLegacy或从legacy到BootstrapSpring派生的自己的启动代码

以下是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>

org.apache.maven.plugins
maven阴影插件
2.4.3
包裹
阴凉处
springframework:springweb
org/springframework/web/SpringServletContainerInitializer.class
META-INF/services/javax.servlet.ServletContainerInitializer
诀窍是将SpringWeb从SpringBootWeb中排除,并添加您自己的着色依赖项。这样,您将摆脱SpringWeb的讨厌的自动启动。
对于引导,最简单的方法是使用spring boot legacy,这也适用于servlet 3.0系统。

首先,感谢您的快速回答,我将试一试,但我不确定这是否有效,因为据我所知,spring仍然自动启动扫描SpringBootServletInitializer。我甚至想禁用spring autostart并自己启动它。好吧,回答我自己的问题,我可能必须以某种方式关闭SpringServletContainerInitializer。再次感谢您的帮助。为什么您需要为此扩展
ContextLoaderListener
?普通的
ServletContextListener
将与覆盖
ContextLoaderListener
的整个行为一样有效。对于Spring Boot,找到
SpringBootServletilizer
,对其进行扩展,覆盖启动时的
方法,并在那里执行您现在在
contextInitialized
方法中执行的操作。我想这应该同样有效。