diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java index 66b72769f77..bc96a6917d9 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfiguration.java @@ -17,6 +17,7 @@ package org.springframework.boot.actuate.autoconfigure; import java.io.IOException; +import java.lang.reflect.Modifier; import javax.servlet.FilterChain; import javax.servlet.Servlet; @@ -28,6 +29,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.BeansException; +import org.springframework.beans.FatalBeanException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -188,13 +190,12 @@ public class EndpointWebMvcAutoConfiguration private void registerEmbeddedServletContainerFactory( AnnotationConfigEmbeddedWebApplicationContext childContext) { try { - EmbeddedServletContainerFactory servletContainerFactory = this.applicationContext - .getBean(EmbeddedServletContainerFactory.class); ConfigurableListableBeanFactory beanFactory = childContext.getBeanFactory(); if (beanFactory instanceof BeanDefinitionRegistry) { BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; registry.registerBeanDefinition("embeddedServletContainerFactory", - new RootBeanDefinition(servletContainerFactory.getClass())); + new RootBeanDefinition( + determineEmbeddedServletContainerFactoryClass())); } } catch (NoSuchBeanDefinitionException ex) { @@ -202,6 +203,25 @@ public class EndpointWebMvcAutoConfiguration } } + private Class determineEmbeddedServletContainerFactoryClass() + throws NoSuchBeanDefinitionException { + Class servletContainerFactoryClass = this.applicationContext + .getBean(EmbeddedServletContainerFactory.class).getClass(); + if (cannotBeInstantiated(servletContainerFactoryClass)) { + throw new FatalBeanException("EmbeddedServletContainerFactory implementation " + + servletContainerFactoryClass.getName() + " cannot be instantiated. " + + "To allow a separate management port to be used, a top-level class " + + "or static inner class should be used instead"); + } + return servletContainerFactoryClass; + } + + private boolean cannotBeInstantiated(Class clazz) { + return clazz.isLocalClass() + || (clazz.isMemberClass() && !Modifier.isStatic(clazz.getModifiers())) + || clazz.isAnonymousClass(); + } + /** * Add an alias for 'local.management.port' that actually resolves using * 'local.server.port'.