Skip to content

Commit

Permalink
Merge branch '3.0.x' into 3.1.x
Browse files Browse the repository at this point in the history
Closes gh-37941
  • Loading branch information
wilkinsona committed Oct 18, 2023
2 parents 9219fdc + a25472a commit 2262210
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 2 deletions.
Expand Up @@ -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();
Expand Down
Expand Up @@ -1161,6 +1161,19 @@ void loadWhenPotentiallyConstructorBoundPropertiesAreImportedUsesJavaBeanBinding
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);
}
Expand Down Expand Up @@ -3043,4 +3056,80 @@ void setProp(String prop) {

}

@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);
}

}

}

0 comments on commit 2262210

Please sign in to comment.