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:
Oliver Gierke
2014-01-19 15:26:06 +01:00
parent debf5c736c
commit 5f8516f505
2 changed files with 30 additions and 8 deletions

View File

@@ -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]);
}
/*

View File

@@ -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> {}
}