Skip to content

Commit ca4b8ab

Browse files
committed
Fix GenericConversionService selects incorrect converter
Signed-off-by: belljun3395 <[email protected]>
1 parent 551f6c0 commit ca4b8ab

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

Diff for: spring-core/src/main/java/org/springframework/core/convert/support/GenericConversionService.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,7 @@ public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
343343

344344
public boolean matchesFallback(TypeDescriptor sourceType, TypeDescriptor targetType) {
345345
return (this.typeInfo.getTargetType() == targetType.getObjectType() &&
346-
this.targetType.hasUnresolvableGenerics() &&
346+
this.targetType.hasUnresolvableGenerics() && targetType.getResolvableType().hasUnresolvableGenerics() &&
347347
(!(this.converter instanceof ConditionalConverter conditionalConverter) ||
348348
conditionalConverter.matches(sourceType, targetType)));
349349
}

Diff for: spring-core/src/test/java/org/springframework/core/convert/support/GenericConversionServiceTests.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,19 @@ void stringToListOfMapConverterWithFallbackMatch() {
594594
assertThat("foo").isEqualTo(result.get(0).get("bar"));
595595
}
596596

597+
@Test
598+
@SuppressWarnings("unchecked")
599+
void stringToListOfString() {
600+
conversionService.addConverter(new StringToCollectionConverter(conversionService));
601+
conversionService.addConverter(new StringToListOfMapConverter());
602+
603+
List<String> result = (List<String>) conversionService.convert("foo,bar",
604+
TypeDescriptor.valueOf(String.class),
605+
TypeDescriptor.collection(List.class, TypeDescriptor.valueOf(String.class))
606+
);
607+
608+
assertThat(result.get(0)).isEqualTo("foo");
609+
}
597610

598611
@ExampleAnnotation(active = true)
599612
public String annotatedString;
@@ -990,5 +1003,4 @@ private static class StringToListOfMapConverter implements Converter<String, Lis
9901003
return List.of(Map.of("bar", source));
9911004
}
9921005
}
993-
9941006
}

0 commit comments

Comments
 (0)