From 336b96b81cfcf2ba2eb4b662a7e671e36a225bec Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Thu, 25 Sep 2014 17:39:53 +0100 Subject: [PATCH] Copy server customization to management context If the actuator endpoints are configured on a different port then there are some settings in the main ServerProperties that we would like to re-use (e.g. the access log). The easiest way to do that is to just configure the management server using the same ServerProperties instance and then overwrite the things that are different (and stored in ManagementServerProperties). Fixes gh-1581 --- .../EndpointWebMvcChildContextConfiguration.java | 12 ++++++++++++ .../EndpointWebMvcAutoConfigurationTests.java | 16 +++++++++++++++- .../src/main/resources/application.properties | 1 + 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java index c15421aa15c..35db5b38637 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcChildContextConfiguration.java @@ -16,6 +16,7 @@ package org.springframework.boot.actuate.autoconfigure; +import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -36,6 +37,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.SearchStrategy; import org.springframework.boot.autoconfigure.web.ErrorAttributes; import org.springframework.boot.autoconfigure.web.HttpMessageConverters; +import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; @@ -75,13 +77,23 @@ public class EndpointWebMvcChildContextConfiguration { // instances get their callback very early in the context lifecycle. private ManagementServerProperties managementServerProperties; + private ServerProperties server; + @Override public void customize(ConfigurableEmbeddedServletContainer container) { if (this.managementServerProperties == null) { this.managementServerProperties = BeanFactoryUtils .beanOfTypeIncludingAncestors(this.beanFactory, ManagementServerProperties.class); + this.server = BeanFactoryUtils + .beanOfTypeIncludingAncestors(this.beanFactory, + ServerProperties.class); } + // Customize as per the parent context first (so e.g. the access logs go to the same place) + server.customize(container); + // Then reset the error pages + container.setErrorPages(Collections.emptySet()); + // and add the management-specific bits container.setPort(this.managementServerProperties.getPort()); container.setAddress(this.managementServerProperties.getAddress()); container.setContextPath(this.managementServerProperties.getContextPath()); diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java index 21218792b82..5c1b4e13a4b 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java @@ -35,6 +35,7 @@ import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration; import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration; import org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext; +import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerInitializedEvent; import org.springframework.boot.test.EnvironmentTestUtils; @@ -222,6 +223,7 @@ public class EndpointWebMvcAutoConfigurationTests { assertThat(localServerPort, notNullValue()); assertThat(localManagementPort, notNullValue()); assertThat(localServerPort, not(equalTo(localManagementPort))); + assertThat(applicationContext.getBean(ServerPortConfig.class).getCount(), equalTo(2)); this.applicationContext.close(); assertAllClosed(); } @@ -303,10 +305,22 @@ public class EndpointWebMvcAutoConfigurationTests { @Configuration public static class ServerPortConfig { + + private int count = 0; + + public int getCount() { + return count; + } @Bean public ServerProperties serverProperties() { - ServerProperties properties = new ServerProperties(); + ServerProperties properties = new ServerProperties() { + @Override + public void customize(ConfigurableEmbeddedServletContainer container) { + count++; + super.customize(container); + } + }; properties.setPort(ports.get().server); return properties; } diff --git a/spring-boot-samples/spring-boot-sample-actuator/src/main/resources/application.properties b/spring-boot-samples/spring-boot-sample-actuator/src/main/resources/application.properties index 49672f79a12..d36c067f877 100644 --- a/spring-boot-samples/spring-boot-sample-actuator/src/main/resources/application.properties +++ b/spring-boot-samples/spring-boot-sample-actuator/src/main/resources/application.properties @@ -1,6 +1,7 @@ logging.file: /tmp/logs/app.log logging.level.org.springframework.security: INFO management.address: 127.0.0.1 +#management.port: 8181 endpoints.shutdown.enabled: true server.tomcat.basedir: target/tomcat server.tomcat.access_log_enabled: true