|
17 | 17 | package org.springframework.http.converter.json;
|
18 | 18 |
|
19 | 19 | import java.io.IOException;
|
| 20 | +import java.lang.reflect.ParameterizedType; |
20 | 21 | import java.lang.reflect.Type;
|
21 | 22 | import java.lang.reflect.TypeVariable;
|
22 | 23 | import java.nio.charset.Charset;
|
@@ -312,11 +313,37 @@ protected void writeSuffix(JsonGenerator generator, Object object) throws IOExce
|
312 | 313 | */
|
313 | 314 | protected JavaType getJavaType(Type type, Class<?> contextClass) {
|
314 | 315 | TypeFactory typeFactory = this.objectMapper.getTypeFactory();
|
315 |
| - if (type instanceof TypeVariable && contextClass != null) { |
316 |
| - ResolvableType resolvedType = resolveVariable( |
317 |
| - (TypeVariable<?>) type, ResolvableType.forClass(contextClass)); |
318 |
| - if (resolvedType != ResolvableType.NONE) { |
319 |
| - return typeFactory.constructType(resolvedType.resolve()); |
| 316 | + if (contextClass != null) { |
| 317 | + ResolvableType resolvedType = ResolvableType.forType(type); |
| 318 | + if (type instanceof TypeVariable) { |
| 319 | + ResolvableType resolvedTypeVariable = resolveVariable( |
| 320 | + (TypeVariable<?>) type, ResolvableType.forClass(contextClass)); |
| 321 | + if (resolvedTypeVariable != ResolvableType.NONE) { |
| 322 | + return typeFactory.constructType(resolvedTypeVariable.resolve()); |
| 323 | + } |
| 324 | + } |
| 325 | + else if (type instanceof ParameterizedType && resolvedType.hasUnresolvableGenerics()) { |
| 326 | + ParameterizedType parameterizedType = (ParameterizedType) type; |
| 327 | + Class<?>[] generics = new Class<?>[parameterizedType.getActualTypeArguments().length]; |
| 328 | + Type[] typeArguments = parameterizedType.getActualTypeArguments(); |
| 329 | + for (int i = 0; i < typeArguments.length; i++) { |
| 330 | + Type typeArgument = typeArguments[i]; |
| 331 | + if (typeArgument instanceof TypeVariable) { |
| 332 | + ResolvableType resolvedTypeArgument = resolveVariable( |
| 333 | + (TypeVariable<?>) typeArgument, ResolvableType.forClass(contextClass)); |
| 334 | + if (resolvedTypeArgument != ResolvableType.NONE) { |
| 335 | + generics[i] = resolvedTypeArgument.resolve(); |
| 336 | + } |
| 337 | + else { |
| 338 | + generics[i] = ResolvableType.forType(typeArgument).resolve(); |
| 339 | + } |
| 340 | + } |
| 341 | + else { |
| 342 | + generics[i] = ResolvableType.forType(typeArgument).resolve(); |
| 343 | + } |
| 344 | + } |
| 345 | + return typeFactory.constructType(ResolvableType. |
| 346 | + forClassWithGenerics(resolvedType.getRawClass(), generics).getType()); |
320 | 347 | }
|
321 | 348 | }
|
322 | 349 | return typeFactory.constructType(type);
|
|
0 commit comments