PagingAndSortingRepository - 自定义可分页响应结构
PagingAndSortingRepository - custom pageable response structure
有没有办法简化从这个控制器 returned 的结构:
@GetMapping
public Iterable<Task> getAll(@PathParam("page") int page) {
Pageable pageable = PageRequest.of(page, 3);
return taskRepository.findAll(pageable);
}
目前回复正文如下:
localhost:8080/api/task?page=2
{
"content": [
...
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 6,
"pageSize": 3,
"pageNumber": 2,
"paged": true,
"unpaged": false
},
"totalElements": 19,
"last": false,
"totalPages": 7,
"number": 2,
"size": 3,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 3,
"first": false,
"empty": false
}
有什么方法可以减少这些数据吗?如果我现在对排序不感兴趣,只想 return 这样的事情怎么办:
{
"content": [
...
],
"pageable": {
"pageSize": 3,
"pageNumber": 2,
"totalElements": 19,
},
}
所以当前的响应有太多我并不真正需要的属性。实现这一目标的好方法是什么?如果我非常想自定义它,是否应该完全不同地执行此操作?
看来您必须使用 @JsonComponent
注释创建自定义 JsonSerializer
。
我将复制代码以供参考,但您可以在此处查看。 PageImpl JSON serialization
@JsonComponent
public class PageImplJacksonSerializer extends JsonSerializer<PageImpl<?>> {
@Override
public void serialize(PageImpl page,
JsonGenerator jsonGenerator,
SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeObjectField("content", page.getContent());
jsonGenerator.writeBooleanField("first", page.isFirst());
jsonGenerator.writeBooleanField("last", page.isLast());
jsonGenerator.writeNumberField("totalPages", page.getTotalPages());
jsonGenerator.writeNumberField("totalElements", page.getTotalElements());
jsonGenerator.writeNumberField("numberOfElements",
page.getNumberOfElements());
jsonGenerator.writeNumberField("size", page.getSize());
jsonGenerator.writeNumberField("number", page.getNumber());
//sort omitted
jsonGenerator.writeEndObject();
}
}
另一种方法是根据需要创建自定义页面 class,并根据您的数据创建 return
@Data
public class CustomPage<T> {
List<T> content;
CustomPageable pageable;
public CustomPage(Page<T> page) {
this.content = page.getContent();
this.pageable = new CustomPageable(page.getPageable().getPageNumber(),
page.getPageable().getPageSize(), page.getTotalElements());
}
@Data
class CustomPageable {
int pageNumber;
int pageSize;
long totalElements;
public CustomPageable(int pageNumber, int pageSize, long totalElements) {
this.pageNumber = pageNumber;
this.pageSize = pageSize;
this.totalElements = totalElements;
}
}
}
然后像这样使用
@GetMapping
public CustomPage<Task> getAll(@PathParam("page") int page) {
Pageable pageable = PageRequest.of(page, 3);
return new CustomPage<Task>(taskRepository.findAll(pageable));
}
注: 这里@Lombok的数据用于setter getter等
有没有办法简化从这个控制器 returned 的结构:
@GetMapping
public Iterable<Task> getAll(@PathParam("page") int page) {
Pageable pageable = PageRequest.of(page, 3);
return taskRepository.findAll(pageable);
}
目前回复正文如下:
localhost:8080/api/task?page=2
{
"content": [
...
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 6,
"pageSize": 3,
"pageNumber": 2,
"paged": true,
"unpaged": false
},
"totalElements": 19,
"last": false,
"totalPages": 7,
"number": 2,
"size": 3,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 3,
"first": false,
"empty": false
}
有什么方法可以减少这些数据吗?如果我现在对排序不感兴趣,只想 return 这样的事情怎么办:
{
"content": [
...
],
"pageable": {
"pageSize": 3,
"pageNumber": 2,
"totalElements": 19,
},
}
所以当前的响应有太多我并不真正需要的属性。实现这一目标的好方法是什么?如果我非常想自定义它,是否应该完全不同地执行此操作?
看来您必须使用
@JsonComponent
注释创建自定义JsonSerializer
。我将复制代码以供参考,但您可以在此处查看。 PageImpl JSON serialization
@JsonComponent
public class PageImplJacksonSerializer extends JsonSerializer<PageImpl<?>> {
@Override
public void serialize(PageImpl page,
JsonGenerator jsonGenerator,
SerializerProvider serializerProvider)
throws IOException {
jsonGenerator.writeStartObject();
jsonGenerator.writeObjectField("content", page.getContent());
jsonGenerator.writeBooleanField("first", page.isFirst());
jsonGenerator.writeBooleanField("last", page.isLast());
jsonGenerator.writeNumberField("totalPages", page.getTotalPages());
jsonGenerator.writeNumberField("totalElements", page.getTotalElements());
jsonGenerator.writeNumberField("numberOfElements",
page.getNumberOfElements());
jsonGenerator.writeNumberField("size", page.getSize());
jsonGenerator.writeNumberField("number", page.getNumber());
//sort omitted
jsonGenerator.writeEndObject();
}
}
另一种方法是根据需要创建自定义页面 class,并根据您的数据创建 return
@Data
public class CustomPage<T> {
List<T> content;
CustomPageable pageable;
public CustomPage(Page<T> page) {
this.content = page.getContent();
this.pageable = new CustomPageable(page.getPageable().getPageNumber(),
page.getPageable().getPageSize(), page.getTotalElements());
}
@Data
class CustomPageable {
int pageNumber;
int pageSize;
long totalElements;
public CustomPageable(int pageNumber, int pageSize, long totalElements) {
this.pageNumber = pageNumber;
this.pageSize = pageSize;
this.totalElements = totalElements;
}
}
}
然后像这样使用
@GetMapping
public CustomPage<Task> getAll(@PathParam("page") int page) {
Pageable pageable = PageRequest.of(page, 3);
return new CustomPage<Task>(taskRepository.findAll(pageable));
}
注: 这里@Lombok的数据用于setter getter等