Merge branch '3.0.x' into 3.1.x

Closes gh-37941
This commit is contained in:
Andy Wilkinson 2023-10-18 18:39:29 +01:00
commit 226221073c
2 changed files with 90 additions and 2 deletions

View File

@ -40,12 +40,11 @@ class CollectionBinder extends IndexedElementsBinder<Collection<Object>> {
@Override
protected Object bindAggregate(ConfigurationPropertyName name, Bindable<?> target,
AggregateElementBinder elementBinder) {
Class<?> collectionType = (target.getValue() != null) ? List.class : target.getType().resolve(Object.class);
ResolvableType aggregateType = ResolvableType.forClassWithGenerics(List.class,
target.getType().asCollection().getGenerics());
ResolvableType elementType = target.getType().asCollection().getGeneric();
IndexedCollectionSupplier result = new IndexedCollectionSupplier(
() -> CollectionFactory.createCollection(collectionType, elementType.resolve(), 0));
() -> CollectionFactory.createCollection(List.class, elementType.resolve(), 0));
bindIndexed(name, target, elementBinder, aggregateType, elementType, result);
if (result.wasSupplied()) {
return result.get();

View File

@ -1161,6 +1161,19 @@ class ConfigurationPropertiesTests {
assertThat(properties.getProp()).isEqualTo("alpha");
}
@Test
void loadWhenBindingToConstructorParametersWithConversionToCustomListImplementation() {
load(ConstructorBoundCustomListPropertiesConfiguration.class, "test.values=a,b");
assertThat(this.context.getBean(ConstructorBoundCustomListProperties.class).getValues()).containsExactly("a",
"b");
}
@Test
void loadWhenBindingToJavaBeanWithConversionToCustomListImplementation() {
load(SetterBoundCustomListPropertiesConfiguration.class, "test.values=a,b");
assertThat(this.context.getBean(SetterBoundCustomListProperties.class).getValues()).containsExactly("a", "b");
}
private AnnotationConfigApplicationContext load(Class<?> configuration, String... inlinedProperties) {
return load(new Class<?>[] { configuration }, inlinedProperties);
}
@ -3043,4 +3056,80 @@ class ConfigurationPropertiesTests {
}
@EnableConfigurationProperties(ConstructorBoundCustomListProperties.class)
static class ConstructorBoundCustomListPropertiesConfiguration {
@Bean
@ConfigurationPropertiesBinding
static Converter<ArrayList<?>, CustomList<?>> arrayListToCustomList() {
return new Converter<ArrayList<?>, CustomList<?>>() {
@Override
public CustomList<?> convert(ArrayList<?> source) {
return new CustomList<>(source);
}
};
}
}
@ConfigurationProperties("test")
static class ConstructorBoundCustomListProperties {
private final CustomList<String> values;
ConstructorBoundCustomListProperties(CustomList<String> values) {
this.values = values;
}
CustomList<String> getValues() {
return this.values;
}
}
@EnableConfigurationProperties(SetterBoundCustomListProperties.class)
static class SetterBoundCustomListPropertiesConfiguration {
@Bean
@ConfigurationPropertiesBinding
static Converter<ArrayList<?>, CustomList<?>> arrayListToCustomList() {
return new Converter<ArrayList<?>, CustomList<?>>() {
@Override
public CustomList<?> convert(ArrayList<?> source) {
return new CustomList<>(source);
}
};
}
}
@ConfigurationProperties("test")
static class SetterBoundCustomListProperties {
private CustomList<String> values;
CustomList<String> getValues() {
return this.values;
}
void setValues(CustomList<String> values) {
this.values = values;
}
}
static final class CustomList<E> extends ArrayList<E> {
CustomList(List<E> delegate) {
super(delegate);
}
}
}