diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/PageJacksonModule.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/PageJacksonModule.java index a2c54baf..c3b56096 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/PageJacksonModule.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/support/PageJacksonModule.java @@ -22,6 +22,7 @@ import java.util.function.Function; import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.databind.Module; @@ -59,6 +60,7 @@ public class PageJacksonModule extends Module { } @JsonDeserialize(as = SimplePageImpl.class) + @JsonIgnoreProperties(ignoreUnknown = true) private interface PageMixIn { } @@ -86,7 +88,7 @@ public class PageJacksonModule extends Module { } } - @JsonIgnore + @JsonProperty @Override public int getTotalPages() { return delegate.getTotalPages(); @@ -110,7 +112,7 @@ public class PageJacksonModule extends Module { return delegate.getSize(); } - @JsonIgnore + @JsonProperty @Override public int getNumberOfElements() { return delegate.getNumberOfElements(); @@ -134,13 +136,13 @@ public class PageJacksonModule extends Module { return delegate.getSort(); } - @JsonIgnore + @JsonProperty @Override public boolean isFirst() { return delegate.isFirst(); } - @JsonIgnore + @JsonProperty @Override public boolean isLast() { return delegate.isLast(); diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/PageJacksonModuleTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/PageJacksonModuleTests.java index c02e7dd6..f83db5a3 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/PageJacksonModuleTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/support/PageJacksonModuleTests.java @@ -82,10 +82,10 @@ public class PageJacksonModuleTests { @Test public void serializeAndDeserializeFilledMultiple() throws JsonProcessingException { // Given - ArrayList strings0 = new ArrayList<>(); - strings0.add("first element"); - strings0.add("second element"); - PageImpl objects = new PageImpl<>(strings0, PageRequest.of(6, 2), 100); + ArrayList pageElements = new ArrayList<>(); + pageElements.add("first element"); + pageElements.add("second element"); + PageImpl objects = new PageImpl<>(pageElements, PageRequest.of(6, 2), 100); assertThat(objects.getContent()).hasSize(2); assertThat(objects.getPageable().getPageSize()).isEqualTo(2); @@ -102,4 +102,57 @@ public class PageJacksonModuleTests { assertThat(result.getPageable().getPageNumber()).isEqualTo(6); } + @Test + public void serializeAndDeserializeEmptyCascade() throws JsonProcessingException { + // Given + PageImpl objects = new PageImpl<>(new ArrayList<>()); + String pageJson = objectMapper.writeValueAsString(objects); + // When + Page result = objectMapper.readValue(pageJson, Page.class); + // Then + assertThat(result).isNotNull(); + assertThat(result.getTotalElements()).isEqualTo(0); + assertThat(result.getContent()).hasSize(0); + + String cascadedPageJson = objectMapper.writeValueAsString(result); + Page cascadedResult = objectMapper.readValue(cascadedPageJson, Page.class); + assertThat(cascadedResult).isNotNull(); + assertThat(cascadedResult.getTotalElements()).isEqualTo(0); + assertThat(cascadedResult.getContent()).hasSize(0); + } + + @Test + public void serializeAndDeserializeFilledMultipleCascade() throws JsonProcessingException { + // Given + ArrayList pageElements = new ArrayList<>(); + pageElements.add("first element in cascaded serialization"); + pageElements.add("second element in cascaded serialization"); + PageImpl objects = new PageImpl<>(pageElements, PageRequest.of(6, 2), 100); + assertThat(objects.getContent()).hasSize(2); + assertThat(objects.getPageable().getPageSize()).isEqualTo(2); + + String pageJson = objectMapper.writeValueAsString(objects); + // When + Page result = objectMapper.readValue(pageJson, Page.class); + // Then + assertThat(result).isNotNull(); + assertThat(result.getTotalElements()).isEqualTo(100); + assertThat(result.getContent()).hasSize(2); + assertThat(result.getContent().get(0)).isEqualTo("first element in cascaded serialization"); + assertThat(result.getContent().get(1)).isEqualTo("second element in cascaded serialization"); + assertThat(result.getPageable().getPageSize()).isEqualTo(2); + assertThat(result.getPageable().getPageNumber()).isEqualTo(6); + + String cascadedPageJson = objectMapper.writeValueAsString(result); + Page cascadedResult = objectMapper.readValue(cascadedPageJson, Page.class); + // Then + assertThat(cascadedResult).isNotNull(); + assertThat(cascadedResult.getTotalElements()).isEqualTo(100); + assertThat(cascadedResult.getContent()).hasSize(2); + assertThat(cascadedResult.getContent().get(0)).isEqualTo("first element in cascaded serialization"); + assertThat(cascadedResult.getContent().get(1)).isEqualTo("second element in cascaded serialization"); + assertThat(cascadedResult.getPageable().getPageSize()).isEqualTo(2); + assertThat(cascadedResult.getPageable().getPageNumber()).isEqualTo(6); + } + }