Closed
Description
This affects spring 6.1.1
The following test passes on 6.0.14 but fails on 6.1.1
import static org.assertj.core.api.Assertions.assertThat;
import static org.springframework.util.ReflectionUtils.findMethod;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;
import org.junit.jupiter.api.Test;
import org.springframework.core.GenericTypeResolver;
import org.springframework.core.MethodParameter;
import org.springframework.core.ParameterizedTypeReference;
public class GenericConverterTypeTest {
@Test
public void foo() {
Method method = findMethod(Bar.class, "accept", (Class<?>[])null);
MethodParameter intMessageMethodParam = new MethodParameter(method, 0);
Type resolveType = GenericTypeResolver.resolveType(intMessageMethodParam.getGenericParameterType(), Bar.class);
ParameterizedTypeReference<List<Map<String, Integer>>> reference = new ParameterizedTypeReference<List<Map<String, Integer>>>() {
};
assertThat(resolveType).isEqualTo(reference.getType());
}
public class Bar {
public void accept(List<Map<String, Integer>> input) {
}
}
}
Failure message:
org.opentest4j.AssertionFailedError:
expected: java.util.List<java.util.Map<java.lang.String, java.lang.Integer>>
but was: java.util.List<java.util.Map>
at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
at app.hs.platform.server.GenericConverterTypeTest.foo(GenericConverterTypeTest.java:25)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
I believe this was caused by f075120
This causes nested generic deserialisation to fail from jackson due to the use of GenericTypeResolver in org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.getJavaType(Type, Class<?>)