From 6124f792b49811936938cc2b0df1fd2d870bdfc2 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 13 Jan 2021 10:15:57 +0100 Subject: [PATCH] #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. --- .../server/mvc/RepresentationModelProcessorInvoker.java | 4 +++- .../mvc/RepresentationModelProcessorInvokerUnitTests.java | 4 ++-- ...ourceProcessorHandlerMethodReturnValueHandlerUnitTest.java | 4 +++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvoker.java b/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvoker.java index c9df0604..feee2f34 100644 --- a/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvoker.java +++ b/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvoker.java @@ -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()); } diff --git a/src/test/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvokerUnitTests.java b/src/test/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvokerUnitTests.java index 9b2c873b..5c93455e 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvokerUnitTests.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvokerUnitTests.java @@ -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>> { + static class CollectionModelOfGenericModelProcessor + implements RepresentationModelProcessor>> { boolean invoked = false; diff --git a/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java b/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java index 40ed9dd7..ca21bb48 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java @@ -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(); } /**