diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/PropertyDescriptorResolver.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/PropertyDescriptorResolver.java index de2e65b9baf..57e07c2a377 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/PropertyDescriptorResolver.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/main/java/org/springframework/boot/configurationprocessor/PropertyDescriptorResolver.java @@ -51,6 +51,9 @@ class PropertyDescriptorResolver { */ Stream> resolve(TypeElement type, ExecutableElement factoryMethod) { TypeElementMembers members = new TypeElementMembers(this.environment, type); + if (factoryMethod != null) { + return resolveJavaBeanProperties(type, factoryMethod, members); + } ExecutableElement constructor = resolveConstructor(type); if (constructor != null) { return resolveConstructorProperties(type, factoryMethod, members, constructor); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/MethodBasedMetadataGenerationTests.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/MethodBasedMetadataGenerationTests.java index b169769e00b..5aa5d34ae68 100644 --- a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/MethodBasedMetadataGenerationTests.java +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationprocessor/MethodBasedMetadataGenerationTests.java @@ -28,6 +28,7 @@ import org.springframework.boot.configurationsample.method.PackagePrivateMethodC import org.springframework.boot.configurationsample.method.PrivateMethodConfig; import org.springframework.boot.configurationsample.method.ProtectedMethodConfig; import org.springframework.boot.configurationsample.method.PublicMethodConfig; +import org.springframework.boot.configurationsample.method.SingleConstructorMethodConfig; import static org.assertj.core.api.Assertions.assertThat; @@ -86,6 +87,17 @@ class MethodBasedMetadataGenerationTests extends AbstractMetadataGenerationTests .has(Metadata.withProperty("conflict.value", String.class).fromSource(MethodAndClassConfig.class)); } + @Test + void singleConstructorMethodConfig() { + ConfigurationMetadata metadata = compile(SingleConstructorMethodConfig.class); + assertThat(metadata).doesNotHave(Metadata.withProperty("foo.my-service", Object.class) + .fromSource(SingleConstructorMethodConfig.Foo.class)); + assertThat(metadata).has( + Metadata.withProperty("foo.name", String.class).fromSource(SingleConstructorMethodConfig.Foo.class)); + assertThat(metadata).has(Metadata.withProperty("foo.flag", Boolean.class).withDefaultValue(false) + .fromSource(SingleConstructorMethodConfig.Foo.class)); + } + @Test void emptyTypeMethodConfig() { ConfigurationMetadata metadata = compile(EmptyTypeMethodConfig.class); diff --git a/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/method/SingleConstructorMethodConfig.java b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/method/SingleConstructorMethodConfig.java new file mode 100644 index 00000000000..e2d23226c54 --- /dev/null +++ b/spring-boot-project/spring-boot-tools/spring-boot-configuration-processor/src/test/java/org/springframework/boot/configurationsample/method/SingleConstructorMethodConfig.java @@ -0,0 +1,64 @@ +/* + * Copyright 2012-2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.configurationsample.method; + +import org.springframework.boot.configurationsample.ConfigurationProperties; + +/** + * Sample for testing method configuration that uses a constructor that should not be + * associated to constructor binding. + * + * @author Stephane Nicoll + */ +public class SingleConstructorMethodConfig { + + @ConfigurationProperties(prefix = "foo") + public Foo foo() { + return new Foo(new Object()); + } + + public static class Foo { + + private String name; + + private boolean flag; + + private final Object myService; + + public Foo(Object myService) { + this.myService = myService; + } + + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isFlag() { + return this.flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + } + +}