Установка DEFAULT_VIEW_INCLUSION имеет глобальный эффект, в то время как нам нужно всего лишь сериализовать объект Page. Следующий код будет регистрировать сериалайзер для страницы, и это простое изменение кода:
@Bean
public Module springDataPageModule() {
return new SimpleModule().addSerializer(Page.class, new JsonSerializer<Page>() {
@Override
public void serialize(Page value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeStartObject();
gen.writeNumberField("totalElements",value.getTotalElements());
gen.writeNumberField("totalPages", value.getTotalPages());
gen.writeNumberField("number", value.getNumber());
gen.writeNumberField("size", value.getSize());
gen.writeBooleanField("first", value.isFirst());
gen.writeBooleanField("last", value.isLast());
gen.writeFieldName("content");
serializers.defaultSerializeValue(value.getContent(),gen);
gen.writeEndObject();
}
});
}
Другой (возможно, более элегантное) решение зарегистрировать следующие ResponseBodyAdvice. Он гарантирует, что конечная точка REST все равно вернет массив JSON и установит HTTP-заголовок «X-Has-Next-Page», чтобы указать, есть ли больше данных. Преимущества: 1) Нет дополнительный счет (*) запроса к вашей БД (один запрос) 2) Response более элегантна, поскольку он возвращает массив JSON
/**
* ResponseBodyAdvice to support Spring data Slice object in JSON responses.
* If the value is a slice, we'll write the List as an array, and add a header to the HTTP response
*
* @author blagerweij
*/
@ControllerAdvice
public class SliceResponseBodyAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
if (body instanceof Slice) {
Slice slice = (Slice) body;
response.getHeaders().add("X-Has-Next-Page", String.valueOf(slice.hasNext()));
return slice.getContent();
}
return body;
}
}
страница здесь является частью библиотеки пружинных данных. Я не могу его изменить. – Pavan
вы можете включить DEFAULT_VIEW_INCLUSION для вашего ObjectMapper –
Можете ли вы вкратце объяснить, как? Спасибо .. – Pavan