From 2f7214002dff9503f33a2f3ec20c36e069dbea2d Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sun, 17 Nov 2013 07:59:03 +0000 Subject: [PATCH] Update Spring to catch SPR-11069 --- .../SecurityAutoConfiguration.java | 4 +- .../SecurityAutoConfigurationTests.java | 13 ++---- .../condition/OnBeanCondition.java | 4 +- .../ConditionalOnMissingBeanTests.java | 44 +++++++++++++++++++ .../autoconfigure/condition/factorybean.xml | 11 +++++ spring-boot-dependencies/pom.xml | 2 +- 6 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/condition/factorybean.xml diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfiguration.java index 16e34439e2..b678eadc76 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfiguration.java @@ -96,9 +96,7 @@ import org.springframework.security.web.util.matcher.AnyRequestMatcher; */ @Configuration @ConditionalOnClass({ EnableWebSecurity.class }) -// TODO: re-enable this when SPR-11069 is fixed -// @ConditionalOnMissingBean(annotation = EnableWebSecurity.class) -@ConditionalOnMissingBean(SecurityAutoConfiguration.class) +@ConditionalOnMissingBean(annotation = EnableWebSecurity.class) @EnableConfigurationProperties public class SecurityAutoConfiguration { diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfigurationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfigurationTests.java index 1cc0677a34..b43b24d397 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfigurationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/SecurityAutoConfigurationTests.java @@ -21,7 +21,6 @@ import org.springframework.boot.TestUtils; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; import org.springframework.mock.web.MockServletContext; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.TestingAuthenticationToken; @@ -46,7 +45,7 @@ public class SecurityAutoConfigurationTests { public void testWebConfiguration() throws Exception { this.context = new AnnotationConfigWebApplicationContext(); this.context.setServletContext(new MockServletContext()); - this.context.register(SecurityConfiguration.class, + this.context.register(SecurityAutoConfiguration.class, EndpointAutoConfiguration.class, ManagementServerPropertiesAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class); @@ -61,7 +60,7 @@ public class SecurityAutoConfigurationTests { public void testDisableIgnoredStaticApplicationPaths() throws Exception { this.context = new AnnotationConfigWebApplicationContext(); this.context.setServletContext(new MockServletContext()); - this.context.register(SecurityConfiguration.class, + this.context.register(SecurityAutoConfiguration.class, EndpointAutoConfiguration.class, ManagementServerPropertiesAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class); @@ -76,7 +75,7 @@ public class SecurityAutoConfigurationTests { public void testDisableBasicAuthOnApplicationPaths() throws Exception { this.context = new AnnotationConfigWebApplicationContext(); this.context.setServletContext(new MockServletContext()); - this.context.register(SecurityConfiguration.class, + this.context.register(SecurityAutoConfiguration.class, EndpointAutoConfiguration.class, ManagementServerPropertiesAutoConfiguration.class, PropertyPlaceholderAutoConfiguration.class); @@ -100,12 +99,6 @@ public class SecurityAutoConfigurationTests { this.context.getBean(AuthenticationManager.class)); } - // Use this while SPR-11069 prevents us from checking OnMissingBean by annotation - @Configuration - @Import(SecurityAutoConfiguration.class) - protected static class SecurityConfiguration { - } - @Configuration protected static class TestConfiguration { diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java index 3cecd666c3..759bd2eb85 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/condition/OnBeanCondition.java @@ -21,7 +21,6 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import java.util.Map; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryUtils; @@ -154,8 +153,7 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit @SuppressWarnings("unchecked") Class typeClass = (Class) ClassUtils .forName(type, classLoader); - Map annotated = beanFactory.getBeansWithAnnotation(typeClass); - result = annotated.keySet().toArray(new String[annotated.size()]); + result = beanFactory.getBeanNamesForAnnotation(typeClass); if (considerHierarchy) { if (beanFactory.getParentBeanFactory() instanceof ConfigurableListableBeanFactory) { String[] parentResult = getBeanNamesForAnnotation( diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java index 150dd08f81..1848afb127 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBeanTests.java @@ -17,10 +17,14 @@ package org.springframework.boot.autoconfigure.condition; import org.junit.Test; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.ImportResource; import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.util.Assert; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; @@ -93,6 +97,18 @@ public class ConditionalOnMissingBeanTests { assertEquals("foo", this.context.getBean("foo")); } + // Rigorous test for SPR-11069 + @Test + public void testAnnotationOnMissingBeanConditionWithEagerFactoryBean() { + this.context.register(FooConfiguration.class, OnAnnotationConfiguration.class, + ConfigurationWithFactoryBean.class, + PropertyPlaceholderAutoConfiguration.class); + this.context.refresh(); + assertFalse(this.context.containsBean("bar")); + assertTrue(this.context.containsBean("example")); + assertEquals("foo", this.context.getBean("foo")); + } + @Configuration @ConditionalOnMissingBean(name = "foo") protected static class OnBeanNameConfiguration { @@ -111,6 +127,11 @@ public class ConditionalOnMissingBeanTests { } } + @Configuration + @ImportResource("org/springframework/boot/autoconfigure/condition/factorybean.xml") + protected static class ConfigurationWithFactoryBean { + } + @Configuration @EnableScheduling protected static class FooConfiguration { @@ -159,4 +180,27 @@ public class ConditionalOnMissingBeanTests { public static class ExampleBean { } + + public static class ExampleFactoryBean implements FactoryBean { + + public ExampleFactoryBean(String value) { + Assert.state(!value.contains("$")); + } + + @Override + public ExampleBean getObject() throws Exception { + return new ExampleBean(); + } + + @Override + public Class getObjectType() { + return ExampleBean.class; + } + + @Override + public boolean isSingleton() { + return false; + } + + } } diff --git a/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/condition/factorybean.xml b/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/condition/factorybean.xml new file mode 100644 index 0000000000..bac59ef4f0 --- /dev/null +++ b/spring-boot-autoconfigure/src/test/resources/org/springframework/boot/autoconfigure/condition/factorybean.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/spring-boot-dependencies/pom.xml b/spring-boot-dependencies/pom.xml index 2e22563b30..1504c7bcb1 100644 --- a/spring-boot-dependencies/pom.xml +++ b/spring-boot-dependencies/pom.xml @@ -34,7 +34,7 @@ 1.7.5 1.12 0.7-groovy-2.0 - 4.0.0.RC1 + 4.0.0.BUILD-SNAPSHOT 2.2.4.RELEASE 1.0.0.M1 2.2.2.RELEASE