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

如何无需编写完整自定义序列化器重命名Spring Page返回的JSON字段

Spring Boot 修改 Page 序列化字段名的简便方案

方案1:使用 Jackson MixIn(全局生效,零侵入原业务代码)

MixIn是Jackson提供的为第三方类动态添加序列化注解的能力,无需修改原生Page类源码即可自定义字段名:

  1. 定义MixIn接口,指定字段映射规则
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.data.domain.Page;
import java.util.List;

public interface PageMixIn<T> {
    // 将content字段重命名为items
    @JsonProperty("items")
    List<T> getContent();
    
    // 如需修改其他字段名,新增对应方法即可,示例:
    // @JsonProperty("total")
    // long getTotalElements();
}
  1. 注册MixIn到Spring容器的ObjectMapper中
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.domain.Page;
import jakarta.annotation.PostConstruct;

@Configuration
public class JacksonConfig {
    private final ObjectMapper objectMapper;

    public JacksonConfig(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @PostConstruct
    public void registerPageMixIn() {
        objectMapper.addMixIn(Page.class, PageMixIn.class);
    }
}

配置完成后全局所有返回Page类型的接口都会自动按照规则重命名字段,不需要修改任何业务代码。

方案2:自定义分页DTO封装(局部生效,灵活性更高)

如果只需要部分接口修改字段名,不想全局生效,可以直接封装自定义分页DTO:

  1. 定义分页结果DTO
import org.springframework.data.domain.Page;
import java.util.List;

public class CustomPage<T> {
    // 自定义字段名
    private List<T> items;
    private long totalElements;
    private int totalPages;
    private Boolean last;
    // 其他需要保留的字段按需添加

    public CustomPage(Page<T> page) {
        this.items = page.getContent();
        this.totalElements = page.getTotalElements();
        this.totalPages = page.getTotalPages();
        this.last = page.isLast();
        // 其他字段赋值
    }

    // 补上所有字段的getter方法
    public List<T> getItems() { return items; }
    public long getTotalElements() { return totalElements; }
    public int getTotalPages() { return totalPages; }
    public Boolean getLast() { return last; }
}
  1. 调整控制器返回值类型
@GetMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE)
public CustomPage<Movies> getAll(Pageable pageable) {
    return new CustomPage<>(this.service.getAll(pageable));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:57:03