You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot升级Jackson后自定义PageImpl反序列化失效问题

问题解决思路与方案

1. 先修复响应格式异常(XML转JSON)

新版本Jackson可能改变了消息转换器的优先级,导致默认返回XML而非JSON。可以通过配置强制指定JSON为默认响应格式:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        // 清空默认转换器,优先添加JSON转换器
        converters.clear();
        converters.add(new MappingJackson2HttpMessageConverter(jacksonObjectMapper()));
        // 如果仍需支持XML,再添加XML转换器(可选)
        // converters.add(new Jaxb2RootElementHttpMessageConverter());
    }

    @Bean
    public ObjectMapper jacksonObjectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        // 配置基础序列化规则,比如忽略空值、不识别未知属性不报错
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return mapper;
    }
}

2. 修复CustomDtoPage的序列化/反序列化逻辑

PageImpl在Jackson新版本中的序列化逻辑有变化,自定义子类需要明确字段映射和构造器:

public class CustomDtoPage<T> extends PageImpl<T> {

    @JsonProperty("content")
    private final List<T> content;
    @JsonProperty("page")
    private final int page;
    @JsonProperty("size")
    private final int size;
    @JsonProperty("totalElements")
    private final long totalElements;

    // 业务用构造器
    public CustomDtoPage(List<T> content, Pageable pageable, long total) {
        super(content, pageable, total);
        this.content = content;
        this.page = pageable.getPageNumber();
        this.size = pageable.getPageSize();
        this.totalElements = total;
    }

    // Jackson反序列化专用构造器
    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public CustomDtoPage(@JsonProperty("content") List<T> content,
                        @JsonProperty("page") int page,
                        @JsonProperty("size") int size,
                        @JsonProperty("totalElements") long totalElements) {
        super(content, PageRequest.of(page, size), totalElements);
        this.content = content;
        this.page = page;
        this.size = size;
        this.totalElements = totalElements;
    }

    // 重写父类getter,确保返回自定义字段值
    @Override
    public int getNumber() {
        return this.page;
    }

    @Override
    public int getSize() {
        return this.size;
    }

    @Override
    public long getTotalElements() {
        return this.totalElements;
    }

    // 重写分页判断方法,基于自定义字段计算
    @Override
    public boolean hasNext() {
        return (this.page + 1) * this.size < this.totalElements;
    }
}

3. 强制锁定兼容的Jackson版本

如果上述配置仍有兼容性问题,直接把Jackson版本锁回Spring Boot 2.1.x兼容的稳定版(比如2.9.10.8):
Maven配置示例:

<properties>
    <jackson.version>2.9.10.8</jackson.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson</groupId>
            <artifactId>jackson-bom</artifactId>
            <version>${jackson.version}</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

内容的提问来源于stack exchange,提问作者DJViking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 15:19:00