From e2aa9126fa5e12154f3fc6fdda897ed62b879b67 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Wed, 28 Oct 2020 22:41:36 +0100 Subject: [PATCH] #1379 - Proper type resolution for CollectionModel post-processing. CollectionModelProcessorWrapper erroneously returned a raw type in case a CollectionModel type assignment check failed which rendered the element type verification to always match as it's effectively compared against Object. We're now returning null to rather proceed with the next candidate type. --- .../RepresentationModelProcessorInvoker.java | 3 ++- ...ntationModelProcessorInvokerUnitTests.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) 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 ecd7603f..c105dde0 100644 --- a/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvoker.java +++ b/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvoker.java @@ -429,6 +429,7 @@ public class RepresentationModelProcessorInvoker { * @param superType must not be {@literal null}. * @return */ + @Nullable private static ResolvableType getSuperType(ResolvableType source, Class superType) { Class rawType = source.getRawClass(); @@ -449,7 +450,7 @@ public class RepresentationModelProcessorInvoker { } } - return ResolvableType.forClass(superType); + return null; } } 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 332e742f..d2d17c98 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvokerUnitTests.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorInvokerUnitTests.java @@ -28,6 +28,7 @@ import org.springframework.hateoas.server.RepresentationModelProcessor; * Unit tests for {@link RepresentationModelProcessorInvoker}. * * @author Oliver Drotbohm + * @author Karina Pleskach */ public class RepresentationModelProcessorInvokerUnitTests { @@ -54,6 +55,20 @@ public class RepresentationModelProcessorInvokerUnitTests { assertThat(processor.invoked).isFalse(); } + @Test // #1379 + void doesNotInvokeProcessorForNonAssignableNestedEntityOnSpecializedCollectionModel() { + + FirstEntityProcessor firstProcessor = new FirstEntityProcessor(); + + RepresentationModelProcessorInvoker invoker = new RepresentationModelProcessorInvoker( + singletonList(firstProcessor)); + + EntityModel entityModel = EntityModel.of(new SecondEntity()); + invoker.invokeProcessorsFor(new MyCollectionModelInheritor<>(singletonList(entityModel))); + + assertThat(firstProcessor.invoked).isFalse(); + } + // #1280 static class GenericPostProcessor> implements RepresentationModelProcessor { @@ -82,4 +97,10 @@ public class RepresentationModelProcessorInvokerUnitTests { return model; } } + + static class MyCollectionModelInheritor extends CollectionModel { + public MyCollectionModelInheritor(Iterable content) { + super(content); + } + } }