@ -62,6 +62,7 @@ import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils ;
import org.springframework.util.ReflectionUtils ;
import org.springframework.util.StringUtils ;
import org.springframework.web.context.ConfigurableWebApplicationContext ;
import org.springframework.web.context.support.GenericWebApplicationContext ;
/ * *
@ -113,14 +114,21 @@ public class SpringBootContextLoader extends AbstractContextLoader {
}
else if ( config instanceof ReactiveWebMergedContextConfiguration ) {
application . setWebApplicationType ( WebApplicationType . REACTIVE ) ;
if ( ! isEmbeddedWebEnvironment ( config ) ) {
application . setApplicationContextFactory (
ApplicationContextFactory . of ( GenericReactiveWebApplicationContext : : new ) ) ;
}
}
else {
application . setWebApplicationType ( WebApplicationType . NONE ) ;
}
application . setApplicationContextFactory ( ( type ) - > {
if ( type ! = WebApplicationType . NONE & & ! isEmbeddedWebEnvironment ( config ) ) {
if ( type = = WebApplicationType . REACTIVE ) {
return new GenericReactiveWebApplicationContext ( ) ;
}
else if ( type = = WebApplicationType . SERVLET ) {
return new GenericWebApplicationContext ( ) ;
}
}
return ApplicationContextFactory . DEFAULT . create ( type ) ;
} ) ;
application . setInitializers ( initializers ) ;
boolean customEnvironent = ReflectionUtils . findMethod ( getClass ( ) , "getEnvironment" )
. getDeclaringClass ( ) ! = SpringBootContextLoader . class ;
@ -285,14 +293,38 @@ public class SpringBootContextLoader extends AbstractContextLoader {
List < ApplicationContextInitializer < ? > > initializers ) {
WebMergedContextConfiguration webConfiguration = ( WebMergedContextConfiguration ) configuration ;
addMockServletContext ( initializers , webConfiguration ) ;
application . setApplicationContextFactory ( ( webApplicationType ) - > new GenericWebApplicationContext ( ) ) ;
}
private void addMockServletContext ( List < ApplicationContextInitializer < ? > > initializers ,
WebMergedContextConfiguration webConfiguration ) {
SpringBootMockServletContext servletContext = new SpringBootMockServletContext (
webConfiguration . getResourceBasePath ( ) ) ;
initializers . add ( 0 , new ServletContextApplicationContextInitializer ( servletContext , true ) ) ;
initializers . add ( 0 , new DefensiveWebApplicationContextInitializer (
new ServletContextApplicationContextInitializer ( servletContext , true ) ) ) ;
}
/ * *
* Decorator for { @link ServletContextApplicationContextInitializer } that prevents
* a failure when the context type is not as was predicted when the initializer
* was registered . This can occur when spring . main . web - application - type is set to
* something other than servlet .
* /
private static final class DefensiveWebApplicationContextInitializer
implements ApplicationContextInitializer < ConfigurableApplicationContext > {
private final ServletContextApplicationContextInitializer delegate ;
private DefensiveWebApplicationContextInitializer ( ServletContextApplicationContextInitializer delegate ) {
this . delegate = delegate ;
}
@Override
public void initialize ( ConfigurableApplicationContext applicationContext ) {
if ( applicationContext instanceof ConfigurableWebApplicationContext ) {
this . delegate . initialize ( ( ConfigurableWebApplicationContext ) applicationContext ) ;
}
}
}
}