Spring Data Rest:能否修改分页结果中的content属性名称?
在Spring Data Rest中修改分页结果的"content"属性名称
当然可以!要修改Spring Data Rest分页返回结果里的content属性名称,有两种实用的方法,你可以根据自己的场景选择:
方法一:自定义分页DTO并转换(适合自定义Controller场景)
如果你的接口是自己编写的Controller方法(比如你提供的getData方法),可以自定义一个分页返回对象,把content字段改成你想要的名称,然后在Service层完成转换:
- 先定义自定义分页类,用
@JsonProperty指定序列化后的字段名:
import com.fasterxml.jackson.annotation.JsonProperty; import java.util.List; import org.springframework.data.domain.Page; public class CustomPage<T> { // 把这里的"data"改成你想要的属性名 @JsonProperty("data") private List<T> content; private int pageNumber; private int pageSize; private long totalElements; private int totalPages; private boolean last; // 直接从Page对象转换的构造方法 public CustomPage(Page<T> page) { this.content = page.getContent(); this.pageNumber = page.getNumber(); this.pageSize = page.getSize(); this.totalElements = page.getTotalElements(); this.totalPages = page.getTotalPages(); this.last = page.isLast(); } // 自行补充getter和setter,也可以用Lombok简化 }
- 修改你的Service/Controller方法,把原Page对象转换成自定义分页对象返回:
public CustomPage<MyObject> getData(Pageable pageable) { Page<MyObject> originalPage = repository.findAll(pageable); return new CustomPage<>(originalPage); }
这种方式的好处是灵活可控,你可以自由调整返回的字段,甚至添加或移除某些分页属性。
方法二:用Jackson MixIn全局修改(适合Spring Data Rest自动暴露的Repository)
如果是Spring Data Rest自动生成的Repository接口(没有自定义Controller),想要全局修改所有分页返回的content字段名,可以用Jackson的MixIn功能来修改Page类的序列化规则:
- 创建一个MixIn抽象类,指定
getContent()方法对应的JSON字段名:
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonTypeInfo; import org.springframework.data.domain.Page; import java.util.List; @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY) public abstract class PageMixIn<T> { // 替换成你想要的属性名 @JsonProperty("data") abstract List<T> getContent(); }
- 配置Spring注册这个MixIn,让Jackson生效:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.domain.Page; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; @Configuration public class JacksonConfiguration { @Bean public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() { return builder -> builder.mixIn(Page.class, PageMixIn.class); } }
这样所有Spring Data Rest返回的Page对象,在序列化时content都会变成你指定的名称,不用修改任何Repository或Service代码,全局生效。
内容的提问来源于stack exchange,提问作者user3016222
相关产品推荐
相关产品推荐

