diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java index 4e08ed8729..b300d92776 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointMBeanExportAutoConfiguration.java @@ -19,16 +19,22 @@ package org.springframework.boot.actuate.autoconfigure; import javax.management.MBeanServer; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfiguration.JmxEnabledCondition; import org.springframework.boot.actuate.endpoint.Endpoint; import org.springframework.boot.actuate.endpoint.jmx.EndpointMBeanExporter; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; +import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.SpringBootCondition; import org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.util.StringUtils; import com.fasterxml.jackson.databind.ObjectMapper; @@ -41,7 +47,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; * @author Andy Wilkinson */ @Configuration -@ConditionalOnExpression("${endpoints.jmx.enabled:true} && ${spring.jmx.enabled:true}") +@Conditional(JmxEnabledCondition.class) @AutoConfigureAfter({ EndpointAutoConfiguration.class, JmxAutoConfiguration.class }) @EnableConfigurationProperties(EndpointMBeanExportProperties.class) public class EndpointMBeanExportAutoConfiguration { @@ -71,4 +77,26 @@ public class EndpointMBeanExportAutoConfiguration { return new JmxAutoConfiguration().mbeanServer(); } + /** + * Condition to check that spring.jmx and endpoints.jmx are enabled. + */ + static class JmxEnabledCondition extends SpringBootCondition { + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + boolean jmxEnabled = isEnabled(context, "spring.jmx."); + boolean jmxEndpointsEnabled = isEnabled(context, "endpoints.jmx."); + return new ConditionOutcome(jmxEnabled && jmxEndpointsEnabled, + "JMX Endpoints"); + } + + private boolean isEnabled(ConditionContext context, String prefix) { + RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( + context.getEnvironment(), prefix); + return resolver.getProperty("enabled", Boolean.class, true); + } + + } + } diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/JolokiaAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/JolokiaAutoConfiguration.java index 32c473d8b5..390e3e044b 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/JolokiaAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/JolokiaAutoConfiguration.java @@ -20,18 +20,24 @@ import java.util.Properties; import org.jolokia.http.AgentServlet; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.actuate.autoconfigure.JolokiaAutoConfiguration.JolokiaCondition; import org.springframework.boot.actuate.endpoint.mvc.JolokiaMvcEndpoint; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.condition.SpringBootCondition; import org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; +import org.springframework.core.type.AnnotatedTypeMetadata; /** * {@link EnableAutoConfiguration Auto-configuration} for embedding Jolokia, a JMX-HTTP @@ -55,7 +61,7 @@ import org.springframework.context.annotation.Configuration; @Configuration @ConditionalOnWebApplication @ConditionalOnClass({ AgentServlet.class }) -@ConditionalOnExpression("${endpoints.jolokia.enabled:${endpoints.enabled:true}}") +@Conditional(JolokiaCondition.class) @AutoConfigureBefore(ManagementSecurityAutoConfiguration.class) @AutoConfigureAfter(EmbeddedServletContainerAutoConfiguration.class) @EnableConfigurationProperties(JolokiaProperties.class) @@ -78,4 +84,26 @@ public class JolokiaAutoConfiguration { return initParameters; } + /** + * Condition to check that the Jolokia endpoint is enabled. + */ + static class JolokiaCondition extends SpringBootCondition { + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + boolean endpointsEnabled = isEnabled(context, "endpoints.", true); + boolean enabled = isEnabled(context, "endpoints.jolokia.", endpointsEnabled); + return new ConditionOutcome(enabled, "Jolokia enabled"); + } + + private boolean isEnabled(ConditionContext context, String prefix, + boolean defaultValue) { + RelaxedPropertyResolver resolver = new RelaxedPropertyResolver( + context.getEnvironment(), prefix); + return resolver.getProperty("enabled", Boolean.class, defaultValue); + } + + } + } diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2RestOperationsConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2RestOperationsConfiguration.java index bfbc8037dd..cd840735cb 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2RestOperationsConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/OAuth2RestOperationsConfiguration.java @@ -19,19 +19,26 @@ package org.springframework.boot.autoconfigure.security.oauth2.client; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.autoconfigure.condition.ConditionOutcome; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnNotWebApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; +import org.springframework.boot.autoconfigure.condition.SpringBootCondition; +import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2RestOperationsConfiguration.OAuth2ClientIdCondition; +import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.boot.context.embedded.FilterRegistrationBean; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.ScopedProxyMode; +import org.springframework.core.env.PropertyResolver; +import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext; @@ -48,6 +55,7 @@ import org.springframework.security.oauth2.config.annotation.web.configuration.E import org.springframework.security.oauth2.config.annotation.web.configuration.OAuth2ClientConfiguration; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; +import org.springframework.util.StringUtils; /** * Configuration for OAuth2 Single Sign On REST operations. @@ -57,7 +65,7 @@ import org.springframework.security.oauth2.provider.authentication.OAuth2Authent */ @Configuration @ConditionalOnClass(EnableOAuth2Client.class) -@ConditionalOnExpression("'${spring.oauth2.client.clientId:}'!=''") +@Conditional(OAuth2ClientIdCondition.class) public class OAuth2RestOperationsConfiguration { @Bean @@ -158,4 +166,20 @@ public class OAuth2RestOperationsConfiguration { } + /** + * Condition to check if a {@code spring.oauth2.client.client-id} is specified. + */ + static class OAuth2ClientIdCondition extends SpringBootCondition { + + @Override + public ConditionOutcome getMatchOutcome(ConditionContext context, + AnnotatedTypeMetadata metadata) { + PropertyResolver resolver = new RelaxedPropertyResolver( + context.getEnvironment(), "spring.oauth2.client."); + String clientId = resolver.getProperty("client-id"); + return new ConditionOutcome(StringUtils.hasLength(clientId), + "Non empty spring.oauth2.client.client-id"); + } + + } }