Использование API с разбивкой по страницам с помощью Spring RestTemplate - PullRequest
0 голосов
/ 20 июня 2019

Я хочу использовать разбитый на страницы API. API предоставляется конечной точкой, созданной с помощью SpringBoot. В поисках решения я нашел этот пост в StackOverflow.

Почти каждый ответ рекомендует создать POJO для анализа. Но поскольку это стандартная проблема, должно быть стандартное решение, которое поддерживается платформой. В упомянутом посте есть ответ Владимир Митев . Он рекомендует использовать ParameterizedTypeReference<PagedResources<T>>. Я взял его порезанный и изменил тип T для моей цели:

restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, new ParameterizedTypeReference<PagedResources<String>>() {});

И это сработало для получения содержимого страницы. Но проблема здесь в том, что предоставленные метаданные продолжают быть нулевыми . Поэтому я не могу перебирать страницы, так как не получаю информацию о totalPages. Правильно ли я определяю ResponseType? Отладка привела меня к мысли, что вызывается конструктор по умолчанию для PagedResources, поэтому объект PageMetadata никогда не устанавливается.

Далее я опишу, как я подошел к проблеме. Может быть, это помогает другим, которые сталкиваются с той же проблемой

Наивный способ использования разбитого на страницы API был:

restTemplate.exchange(targetUrl, HttpMethod.GET, requestEntity, String.class);

Это дает нам представление о базовой структуре данных, которая выглядит следующим образом.

<200,
{
   "content":[
      "Data1",
      "Data2",
      "Data3"
   ],
   "pageable":{
      "sort":{
         "sorted":false,
         "unsorted":true,
         "empty":true
      },
      "offset":0,
      "pageSize":20,
      "pageNumber":0,
      "paged":true,
      "unpaged":false
   },
   "number":0,
   "sort":{
      "sorted":false,
      "unsorted":true,
      "empty":true
   },
   "size":20,
   "first":true,
   "numberOfElements":20,
   "totalPages":5,
   "totalElements":90,
   "last":false,
   "empty":false
},
[
   Cache-Control:"no-cache, no-store, max-age=0, must
-revalidate",
   Content-Type:"application/json;charset=UTF-8",
   Date:"Thu, 20 Jun 2019 17:38:18 GMT",
   Expires:"0",
   Pragma:"no-cache",
   Server:"nginx/1.15.10",
   X-Content-Type-Options:"nosniff"

Это выглядит как стандартный объект отклика на пружину. Поэтому должен быть способ напрямую преобразовать этот ответ в какой-то заранее определенный объект.

Поэтому я попытался изменить параметр ResponseType: Page.class в результате

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.data.domain.Page]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.springframework.data.domain.Page (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

и PageImpl.class, в результате

org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.springframework.data.domain.PageImpl]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of org.springframework.data.domain.PageImpl (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)

Так что должен быть другой ResponseType для разбора ответа в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...