Browse Source

DATACMNS-972 - Fixed ProjectingJackson2HttpMessageConverter.canRead(…) for generic type variables.

ProjectingJackson2HttpMessageConverter.canRead(…) now resolves the given type correctly, even in context of their owning class.
pull/194/head
Oliver Gierke 9 years ago
parent
commit
50b84e701f
  1. 3
      src/main/java/org/springframework/data/web/ProjectingJackson2HttpMessageConverter.java
  2. 29
      src/test/java/org/springframework/data/web/ProjectingJackson2HttpMessageConverterUnitTests.java

3
src/main/java/org/springframework/data/web/ProjectingJackson2HttpMessageConverter.java

@ -117,7 +117,8 @@ public class ProjectingJackson2HttpMessageConverter extends MappingJackson2HttpM @@ -117,7 +117,8 @@ public class ProjectingJackson2HttpMessageConverter extends MappingJackson2HttpM
return false;
}
Class<?> rawType = ResolvableType.forType(type).getRawClass();
ResolvableType owner = contextClass == null ? null : ResolvableType.forClass(contextClass);
Class<?> rawType = ResolvableType.forType(type, owner).resolve(Object.class);
Boolean result = supportedTypesCache.get(rawType);
if (result != null) {

29
src/test/java/org/springframework/data/web/ProjectingJackson2HttpMessageConverterUnitTests.java

@ -18,6 +18,9 @@ package org.springframework.data.web; @@ -18,6 +18,9 @@ package org.springframework.data.web;
import static org.hamcrest.CoreMatchers.*;
import static org.junit.Assert.*;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import org.junit.Test;
import org.springframework.http.MediaType;
@ -48,10 +51,36 @@ public class ProjectingJackson2HttpMessageConverterUnitTests { @@ -48,10 +51,36 @@ public class ProjectingJackson2HttpMessageConverterUnitTests {
assertThat(converter.canRead(SampleClass.class, ANYTHING_JSON), is(false));
}
@Test // DATACMNS-972
public void doesNotConsiderTypeVariableBoundTo() throws Throwable {
Method method = BaseController.class.getDeclaredMethod("createEntity", AbstractDto.class);
Type type = method.getGenericParameterTypes()[0];
assertThat(converter.canRead(type, BaseController.class, ANYTHING_JSON), is(false));
}
@Test // DATACMNS-972
public void genericTypeOnConcreteOne() throws Throwable {
Method method = ConcreteController.class.getMethod("createEntity", AbstractDto.class);
Type type = method.getGenericParameterTypes()[0];
assertThat(converter.canRead(type, ConcreteController.class, ANYTHING_JSON), is(false));
}
@ProjectedPayload
interface SampleInterface {}
interface UnannotatedInterface {}
class SampleClass {}
class AbstractDto {}
abstract class BaseController<D extends AbstractDto> {
public void createEntity(D dto) {}
}
class ConcreteController extends BaseController<AbstractDto> {}
}

Loading…
Cancel
Save