如何无需编写完整自定义序列化器重命名Spring Page返回的JSON字段
Spring Boot 修改 Page 序列化字段名的简便方案
方案1:使用 Jackson MixIn(全局生效,零侵入原业务代码)
MixIn是Jackson提供的为第三方类动态添加序列化注解的能力,无需修改原生Page类源码即可自定义字段名:
- 定义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(); }
- 注册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:
- 定义分页结果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; } }
- 调整控制器返回值类型
@GetMapping(value = "/", produces = MediaType.APPLICATION_JSON_VALUE) public CustomPage<Movies> getAll(Pageable pageable) { return new CustomPage<>(this.service.getAll(pageable)); }
内容的提问来源于stack exchange,提问作者saulotoledo
相关产品推荐
相关产品推荐

