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 705e3229..2f11c523 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 @@ -38,6 +38,8 @@ import org.springframework.data.domain.Sort; * * @author Pascal Büttiker * @author Olga Maciaszek-Sharma + * @author Pedro Mendes + * @author Nikita Konev */ public class PageJacksonModule extends Module { @@ -69,18 +71,22 @@ public class PageJacksonModule extends Module { @JsonProperty("size") int size, @JsonProperty("totalElements") @JsonAlias({ "total-elements", "total_elements", "totalelements", "TotalElements" }) long totalElements, @JsonProperty("sort") Sort sort) { - PageRequest pageRequest; - if (sort != null) { - pageRequest = PageRequest.of(number, size, sort); + if (size > 0) { + PageRequest pageRequest; + if (sort != null) { + pageRequest = PageRequest.of(number, size, sort); + } + else { + pageRequest = PageRequest.of(number, size); + } + delegate = new PageImpl<>(content, pageRequest, totalElements); } else { - pageRequest = PageRequest.of(number, size); + delegate = new PageImpl<>(content); } - delegate = new PageImpl<>(content, pageRequest, totalElements); - } - @JsonProperty + @JsonIgnore @Override public int getTotalPages() { return delegate.getTotalPages(); @@ -104,7 +110,7 @@ public class PageJacksonModule extends Module { return delegate.getSize(); } - @JsonProperty + @JsonIgnore @Override public int getNumberOfElements() { return delegate.getNumberOfElements(); @@ -128,13 +134,13 @@ public class PageJacksonModule extends Module { return delegate.getSort(); } - @JsonProperty + @JsonIgnore @Override public boolean isFirst() { return delegate.isFirst(); } - @JsonProperty + @JsonIgnore @Override public boolean isLast() { return delegate.isLast(); @@ -176,6 +182,18 @@ public class PageJacksonModule extends Module { return delegate.iterator(); } + @JsonIgnore + @Override + public Pageable getPageable() { + return delegate.getPageable(); + } + + @JsonIgnore + @Override + public boolean isEmpty() { + return delegate.isEmpty(); + } + } } 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 d7561fb0..8ad9e06e 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 @@ -16,13 +16,18 @@ package org.springframework.cloud.openfeign.support; +import java.util.ArrayList; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.PageRequest; import static org.assertj.core.api.Assertions.assertThat; @@ -31,6 +36,8 @@ import static org.assertj.core.api.Assertions.assertThat; * * @author Ruben Vervaeke * @author Olga Maciaszek-Sharma + * @author Pedro Mendes + * @author Nikita Konev */ public class PageJacksonModuleTests { @@ -40,6 +47,7 @@ public class PageJacksonModuleTests { public static void initialize() { objectMapper = new ObjectMapper(); objectMapper.registerModule(new PageJacksonModule()); + objectMapper.registerModule(new SortJacksonModule()); } @ParameterizedTest @@ -58,4 +66,40 @@ public class PageJacksonModuleTests { assertThat(result.getPageable().getPageNumber()).isEqualTo(1); } + @Test + public void serializeAndDeserializeEmpty() 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); + } + + @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); + 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"); + assertThat(result.getContent().get(1)).isEqualTo("second element"); + assertThat(result.getPageable().getPageSize()).isEqualTo(2); + assertThat(result.getPageable().getPageNumber()).isEqualTo(6); + } + }