Skip to content

GenericTypeResolver does not resolve nested generics - causes issues with Jackson & Spring MVC #31690

Closed
@harmonic-ben

Description

@harmonic-ben

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<?>)

Metadata

Metadata

Assignees

Labels

in: coreIssues in core modules (aop, beans, core, context, expression)type: regressionA bug that is also a regression

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions