DATACMNS-422 - Mitigate semantic changes in Spring 4.0's GenericTypeResolver.
In case of an unresolvable generic parameter in TypeDiscoverer's getTypeArgument(…) we check for a generic super type for the given bound and fall back to Object in case we find a parameterized type.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011-2013 the original author or authors.
|
||||
* Copyright 2011-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -309,7 +309,7 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
|
||||
public TypeInformation<?> getMapValueType() {
|
||||
|
||||
if (isMap()) {
|
||||
return getTypeArgument(getType(), Map.class, 1);
|
||||
return getTypeArgument(Map.class, 1);
|
||||
}
|
||||
|
||||
List<TypeInformation<?>> arguments = getTypeArguments();
|
||||
@@ -349,11 +349,11 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
|
||||
}
|
||||
|
||||
if (isMap()) {
|
||||
return getTypeArgument(rawType, Map.class, 0);
|
||||
return getTypeArgument(Map.class, 0);
|
||||
}
|
||||
|
||||
if (Iterable.class.isAssignableFrom(rawType)) {
|
||||
return getTypeArgument(rawType, Iterable.class, 0);
|
||||
return getTypeArgument(Iterable.class, 0);
|
||||
}
|
||||
|
||||
List<TypeInformation<?>> arguments = getTypeArguments();
|
||||
@@ -449,9 +449,16 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
|
||||
return target.getSuperTypeInformation(getType()).equals(this);
|
||||
}
|
||||
|
||||
private TypeInformation<?> getTypeArgument(Class<?> type, Class<?> bound, int index) {
|
||||
Class<?>[] arguments = GenericTypeResolver.resolveTypeArguments(type, bound);
|
||||
return arguments == null ? null : createInfo(arguments[index]);
|
||||
private TypeInformation<?> getTypeArgument(Class<?> bound, int index) {
|
||||
|
||||
Class<?>[] arguments = GenericTypeResolver.resolveTypeArguments(getType(), bound);
|
||||
|
||||
if (arguments == null) {
|
||||
return getSuperTypeInformation(bound) instanceof ParameterizedTypeInformation ? ClassTypeInformation.OBJECT
|
||||
: null;
|
||||
}
|
||||
|
||||
return createInfo(arguments[index]);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2011-2013 the original author or authors.
|
||||
* Copyright 2011-2014 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -285,6 +285,16 @@ public class ClassTypeInformationUnitTests {
|
||||
from(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* @see DATACMNS-422
|
||||
*/
|
||||
@Test
|
||||
public void returnsNullForRawTypesOnly() {
|
||||
|
||||
assertThat(from(MyRawIterable.class).getComponentType(), is(nullValue()));
|
||||
assertThat(from(MyIterable.class).getComponentType(), is(notNullValue()));
|
||||
}
|
||||
|
||||
static class StringMapContainer extends MapContainer<String> {
|
||||
|
||||
}
|
||||
@@ -409,4 +419,9 @@ public class ClassTypeInformationUnitTests {
|
||||
interface Identifiable {
|
||||
Long getId();
|
||||
}
|
||||
|
||||
@SuppressWarnings("rawtypes")
|
||||
interface MyRawIterable extends Iterable {}
|
||||
|
||||
interface MyIterable<T> extends Iterable<T> {}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user