diff --git a/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/src/main/java/org/springframework/data/util/TypeDiscoverer.java index 67e979c985..acb14d3578 100644 --- a/src/main/java/org/springframework/data/util/TypeDiscoverer.java +++ b/src/main/java/org/springframework/data/util/TypeDiscoverer.java @@ -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 @@ public boolean isMap() { public TypeInformation getMapValueType() { if (isMap()) { - return getTypeArgument(getType(), Map.class, 1); + return getTypeArgument(Map.class, 1); } List> arguments = getTypeArguments(); @@ -349,11 +349,11 @@ public TypeInformation getComponentType() { } 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> arguments = getTypeArguments(); @@ -449,9 +449,16 @@ public boolean isAssignableFrom(TypeInformation target) { 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]); } /* diff --git a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java index cb57bbcf91..71b6e26686 100644 --- a/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java +++ b/src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java @@ -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 void rejectsNullClass() { 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 { } @@ -409,4 +419,9 @@ interface Category extends Identifiable { interface Identifiable { Long getId(); } + + @SuppressWarnings("rawtypes") + interface MyRawIterable extends Iterable {} + + interface MyIterable extends Iterable {} }