diff --git a/src/main/java/org/springframework/data/web/SlicedResourcesAssembler.java b/src/main/java/org/springframework/data/web/SlicedResourcesAssembler.java index 292e1dcab..a647ff130 100644 --- a/src/main/java/org/springframework/data/web/SlicedResourcesAssembler.java +++ b/src/main/java/org/springframework/data/web/SlicedResourcesAssembler.java @@ -143,10 +143,11 @@ public class SlicedResourcesAssembler * @param slice must not be {@literal null}. * @param assembler must not be {@literal null}. * @param link must not be {@literal null}. - * @return + * @return a {@link SlicedModel} must not be {@literal null}. */ public > SlicedModel toModel(Slice slice, RepresentationModelAssembler assembler, Link link) { + Assert.notNull(link, "Link must not be null"); return createModel(slice, assembler, link); } @@ -166,15 +167,14 @@ public class SlicedResourcesAssembler * * @param slice must not be {@literal null}, content must be empty. * @param type must not be {@literal null}. - * @param link must not be {@literal null}. - * @return + * @param link can be {@literal null}. + * @return a {@link SlicedModel} must not be {@literal null}. */ public SlicedModel toEmptyModel(Slice slice, Class type, @Nullable Link link) { Assert.notNull(slice, "Slice must not be null"); Assert.isTrue(!slice.hasContent(), "Slice must not have any content"); Assert.notNull(type, "Type must not be null"); - Assert.notNull(link, "Link must not be null"); SliceMetadata metadata = asSliceMetadata(slice); @@ -187,6 +187,7 @@ public class SlicedResourcesAssembler @Deprecated public SlicedModel toEmptyModel(Slice slice, Class type, Optional link) { + Assert.notNull(link, "Link must not be null"); return toEmptyModel(slice, type, link.orElse(null)); } diff --git a/src/test/java/org/springframework/data/web/SlicedResourcesAssemblerUnitTest.java b/src/test/java/org/springframework/data/web/SlicedResourcesAssemblerUnitTest.java index 59c799623..acd7570e1 100644 --- a/src/test/java/org/springframework/data/web/SlicedResourcesAssemblerUnitTest.java +++ b/src/test/java/org/springframework/data/web/SlicedResourcesAssemblerUnitTest.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.data.domain.AbstractPageRequest; @@ -259,6 +260,32 @@ class SlicedResourcesAssemblerUnitTest { .isEqualTo("http://localhost/sample?foo=bar&page=0&size=1"); } + @Test // GH-3452 + void emptySliceCreatorNullLink() { + + var result = assembler.toEmptyModel(EMPTY_SLICE, Person.class, (Link) null); + + var content = result.getContent(); + assertThat(content).hasSize(1); + + var element = content.iterator().next(); + assertThat(element).isInstanceOf(EmbeddedWrapper.class); + assertThat(((EmbeddedWrapper) element).getRelTargetType()).isEqualTo(Person.class); + } + + @Test // GH-3452 + @SuppressWarnings("deprecation") + void emptySliceCreatorRejectsNullOptionalLink() { + + assertThatIllegalArgumentException() + .isThrownBy(() -> assembler.toEmptyModel(EMPTY_SLICE, Person.class, (Optional) null)); + } + + @Test // GH-3452 + void createsSliceRejectsNullLink() { + assertThatIllegalArgumentException().isThrownBy(() -> assembler.toModel(createSlice(1), (Link) null)); + } + private static Slice createSlice(int index) { Pageable request = PageRequest.of(index, 1);