Skip to content

Commit

Permalink
Fix broken serialization of Unpaged instances.
Browse files Browse the repository at this point in the history
We now reinstantiate the serialization of Unpaged instances as plain INSTANCE strings as they were rendered before Unpaged was changed from an enum into a class.

Note, that we still strongly advise, not to serialize Page instances directly as it's a domain type, its Jackson-level surface is subject to change if we need to change the type's API for unrelated reasons.

Fixes: GH-2987.
  • Loading branch information
odrotbohm committed Jan 12, 2024
1 parent 989af7d commit 3f14df6
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,19 @@
*/
package org.springframework.data.web.config;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.geo.GeoModule;
import org.springframework.lang.Nullable;
import org.springframework.util.ClassUtils;

import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializerBase;
import com.fasterxml.jackson.databind.util.StdConverter;

/**
* JavaConfig class to export Jackson specific configuration.
Expand All @@ -29,4 +40,45 @@ public class SpringDataJacksonConfiguration implements SpringDataJacksonModules
public GeoModule jacksonGeoModule() {
return new GeoModule();
}

@Bean
public PageModule pageModule() {
return new PageModule();
}

public static class PageModule extends SimpleModule {

private static final long serialVersionUID = 275254460581626332L;

private static final String UNPAGED_TYPE_NAME = "org.springframework.data.domain.Unpaged";
private static final Class<?> UNPAGED_TYPE;

static {
UNPAGED_TYPE = ClassUtils.resolveClassName(UNPAGED_TYPE_NAME, PageModule.class.getClassLoader());
}

public PageModule() {
addSerializer(UNPAGED_TYPE, new UnpagedAsInstanceSerializer());
}

/**
* A Jackson serializer rendering instances of {@link org.springframework.data.domain.Unpaged} as {@code INSTANCE}
* as it was previous rendered.
*
* @author Oliver Drotbohm
*/
static class UnpagedAsInstanceSerializer extends ToStringSerializerBase {

private static final long serialVersionUID = -1213451755610144637L;

public UnpagedAsInstanceSerializer() {
super(Object.class);
}

@Override
public String valueToString(@Nullable Object value) {
return "INSTANCE";
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/*
* Copyright 2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.data.web;

import static org.assertj.core.api.Assertions.*;

import java.util.Collections;

import org.junit.jupiter.api.Test;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.web.config.SpringDataJacksonConfiguration;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
* Unit tests for PageImpl serialization.
*
* @author Oliver Drotbohm
*/
class PageImplJsonSerializationUnitTests {

@Test
void serializesPageImplAsJson() {

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new SpringDataJacksonConfiguration.PageModule());

assertThatNoException().isThrownBy(() -> {
mapper.writeValueAsString(new PageImpl<>(Collections.emptyList()));
});
}
}

0 comments on commit 3f14df6

Please sign in to comment.