#1431 - Fix evaluation of nested generics in RepresentationModelProcessor.

The code handling CollectionModel types now also checks for the element type being a RepresentationModel instance and checking whether the detected collection element matches the declared type.
This commit is contained in:
Oliver Drotbohm
2021-01-13 10:15:57 +01:00
parent 89784a47f4
commit 6124f792b4
3 changed files with 8 additions and 4 deletions

View File

@@ -383,7 +383,7 @@ public class RepresentationModelProcessorInvoker {
* @param target that target {@link ResolvableType}.
* @return
*/
static boolean isValueTypeMatch(@Nullable CollectionModel<?> collectionModel, ResolvableType target) {
boolean isValueTypeMatch(@Nullable CollectionModel<?> collectionModel, ResolvableType target) {
if (collectionModel == null) {
return false;
@@ -415,6 +415,8 @@ public class RepresentationModelProcessorInvoker {
if (element instanceof EntityModel) {
return EntityModelProcessorWrapper.isValueTypeMatch((EntityModel<?>) element, resourceType);
} else if (element instanceof RepresentationModel) {
return resourceType.isInstance(element);
} else if (element instanceof EmbeddedWrapper) {
return isRawTypeAssignable(resourceType, ((EmbeddedWrapper) element).getRelTargetType());
}

View File

@@ -73,7 +73,6 @@ public class RepresentationModelProcessorInvokerUnitTests {
void doesInvokeProcessorForCollectionModelOfRepresentationModel() {
CollectionModelOfGenericModelProcessor processor = new CollectionModelOfGenericModelProcessor();
RepresentationModelProcessorInvoker invoker = new RepresentationModelProcessorInvoker(
singletonList(processor));
@@ -114,7 +113,8 @@ public class RepresentationModelProcessorInvokerUnitTests {
}
// 1425
static class CollectionModelOfGenericModelProcessor implements RepresentationModelProcessor<CollectionModel<GenericModel<?>>> {
static class CollectionModelOfGenericModelProcessor
implements RepresentationModelProcessor<CollectionModel<GenericModel<?>>> {
boolean invoked = false;

View File

@@ -269,8 +269,10 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest {
void resourcesProcessorMatchesValueSubTypes() {
ResolvableType type = ResolvableType.forClass(PagedStringResources.class);
CollectionModelProcessorWrapper wrapper = new CollectionModelProcessorWrapper(
mock(RepresentationModelProcessor.class));
assertThat(CollectionModelProcessorWrapper.isValueTypeMatch(FOO_PAGE, type)).isTrue();
assertThat(wrapper.isValueTypeMatch(FOO_PAGE, type)).isTrue();
}
/**