diff --git a/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java b/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java index 18a689a75..21c4b8716 100644 --- a/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java +++ b/src/main/java/org/springframework/data/web/config/SpringDataJacksonConfiguration.java @@ -58,7 +58,9 @@ public class SpringDataJacksonConfiguration implements SpringDataJacksonModules } public PageModule() { + addSerializer(UNPAGED_TYPE, new UnpagedAsInstanceSerializer()); + setMixInAnnotation(PageImpl.class, PageImplMixin.class); } /** @@ -80,5 +82,36 @@ public class SpringDataJacksonConfiguration implements SpringDataJacksonModules return "INSTANCE"; } } + + /** + * A mixin for PageImpl to register a converter issuing the serialization warning. + * + * @author Oliver Drotbohm + */ + @JsonSerialize(converter = PlainPageSerializationWarning.class) + abstract class PageImplMixin {} + + static class PlainPageSerializationWarning extends StdConverter, Page> { + + private static final Logger LOGGER = LoggerFactory.getLogger(PlainPageSerializationWarning.class); + private static final String MESSAGE = """ + Serializing PageImpl instances as-is is not supported, meaning that there is no guarantee about the stability of the resulting JSON structure! + For a stable JSON structure, please use Spring HATEOAS and Spring Data's PagedResourcesAssembler as documented in https://docs.spring.io/spring-data/commons/reference/repositories/core-extensions.html#core.web.pageables. + """; + + private boolean warningRendered = false; + + @Nullable + @Override + public Page convert(@Nullable Page value) { + + if (!warningRendered) { + this.warningRendered = true; + LOGGER.warn(MESSAGE); + } + + return value; + } + } } }