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