fix cascading deserialization Spring Data's Page by setting @JsonIgnoreProperties(ignoreUnknown = true), revert ignoring getTotalPages(), getNumberOfElements(), isFirst(), isLast() (#653)

This commit is contained in:
Nikita Konev
2022-01-14 19:22:04 +03:00
committed by Olga Maciaszek-Sharma
parent 7e01355317
commit 8fdb488697
2 changed files with 63 additions and 8 deletions

View File

@@ -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();

View File

@@ -82,10 +82,10 @@ public class PageJacksonModuleTests {
@Test
public void serializeAndDeserializeFilledMultiple() throws JsonProcessingException {
// Given
ArrayList<Object> strings0 = new ArrayList<>();
strings0.add("first element");
strings0.add("second element");
PageImpl<Object> objects = new PageImpl<>(strings0, PageRequest.of(6, 2), 100);
ArrayList<Object> pageElements = new ArrayList<>();
pageElements.add("first element");
pageElements.add("second element");
PageImpl<Object> 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<Object> 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<Object> pageElements = new ArrayList<>();
pageElements.add("first element in cascaded serialization");
pageElements.add("second element in cascaded serialization");
PageImpl<Object> 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);
}
}