Is there a way to simplify the structure returned from this controller:
@GetMapping
public Iterable getAll(@PathParam("page") int page)
Another way is to create a custom page class as you want and create from your data and 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;
}
}
}
And use like this
@GetMapping
public CustomPage<Task> getAll(@PathParam("page") int page) {
Pageable pageable = PageRequest.of(page, 3);
return new CustomPage<Task>(taskRepository.findAll(pageable));
}
Note: Here @Data of Lombok used for setter getter etc.
It looks like you have to create custom JsonSerializer
with @JsonComponent
annotation.
I will copy the code for reference but you can see it here. 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();
}
}