Browse Source

DATACMNS-855 - Prevent memory leak in SyntheticParameterizedType.

Added proper equals(…) and hashCode() methods to SyntheticParameterizedType to make sure instances created for the same type information and type parameters are considered equal.
pull/172/head
Oliver Gierke 10 years ago
parent
commit
0cab1ddf72
  1. 23
      src/main/java/org/springframework/data/util/TypeDiscoverer.java
  2. 18
      src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java

23
src/main/java/org/springframework/data/util/TypeDiscoverer.java

@ -15,6 +15,10 @@ @@ -15,6 +15,10 @@
*/
package org.springframework.data.util;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
@ -558,23 +562,12 @@ class TypeDiscoverer<S> implements TypeInformation<S> { @@ -558,23 +562,12 @@ class TypeDiscoverer<S> implements TypeInformation<S> {
* @author Oliver Gierke
* @since 1.11
*/
@EqualsAndHashCode
@RequiredArgsConstructor
private static class SyntheticParamterizedType implements ParameterizedType {
private final ClassTypeInformation<?> typeInformation;
private final List<TypeInformation<?>> typeParameters;
/**
* @param typeInformation must not be {@literal null}.
* @param typeParameters must not be {@literal null}.
*/
public SyntheticParamterizedType(ClassTypeInformation<?> typeInformation, List<TypeInformation<?>> typeParameters) {
Assert.notNull(typeInformation, "Type must not be null!");
Assert.notNull(typeParameters, "Type parameters must not be null!");
this.typeInformation = typeInformation;
this.typeParameters = typeParameters;
}
private final @NonNull ClassTypeInformation<?> typeInformation;
private final @NonNull List<TypeInformation<?>> typeParameters;
/*
* (non-Javadoc)

18
src/test/java/org/springframework/data/util/ClassTypeInformationUnitTests.java

@ -382,6 +382,24 @@ public class ClassTypeInformationUnitTests { @@ -382,6 +382,24 @@ public class ClassTypeInformationUnitTests {
assertThat(property.specialize(from), is((TypeInformation) from));
}
/**
* @see DATACMNS-855
*/
@Test
@SuppressWarnings("rawtypes")
public void specializedTypeEqualsAndHashCode() {
ClassTypeInformation<Foo> root = ClassTypeInformation.from(Foo.class);
TypeInformation<?> property = root.getProperty("abstractBar");
TypeInformation left = property.specialize(ClassTypeInformation.from(Bar.class));
TypeInformation right = property.specialize(ClassTypeInformation.from(Bar.class));
assertThat(left, is(right));
assertThat(right, is(left));
assertThat(left.hashCode(), is(right.hashCode()));
}
static class StringMapContainer extends MapContainer<String> {
}

Loading…
Cancel
Save