Call Paginated Spring rest api из другого весеннего проекта - PullRequest
0 голосов
/ 16 октября 2019

Я строю один API, который разбит на страницы, его вывод выглядит следующим образом:

{
    "content": [
               {JSON1},
               {JSON2},
               ...
               {JSON20}
               ],
    "pageable": {
        "sort": {
            "sorted": true,
            "unsorted": false,
            "empty": false
        },
        "offset": 0,
        "pageSize": 20,
        "pageNumber": 0,
        "unpaged": false,
        "paged": true
    },
    "totalPages": 2,
    "totalElements": 32,
    "last": false,
    "size": 20,
    "number": 0,
    "sort": {
        "sorted": true,
        "unsorted": false,
        "empty": false
    },
    "numberOfElements": 20,
    "first": true,
    "empty": false
}

Итак, для этого вызова у меня есть две страницы, и по одной на каждой странице у нас будет 20 сущностей JSON.

Я хотел вызвать ту же самую конечную точку из шаблона остальных.

До разбивки на страницы я использовал для вызова той же конечной точки, как это:

MyEntity[] responseEntity;

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Accept", MediaType.APPLICATION_JSON_VALUE);

// request entity is created with request headers
HttpEntity<MyEntity> requestEntity = new HttpEntity<>(requestHeaders);

Map<String, String> params = new HashMap<>();
params.put("feild1", val1);             
params.put("feild2", val2);             
responseEntity = restTemplate.getForObject(ApiEndpoint,MyEntity[].class,params);

Поскольку конечная точка возвращалась в форматеиз массива MyEntity, приведенный выше код достаточно хорош. Теперь у меня есть конечная точка отдыха с разбивкой на страницы.

Как мне вызвать конечную точку с разбивкой на страницы и снова получить данные массива MyEntity?

До сих пор я пытался вызывать с: это не работает для меня.

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ApiEndpoint);

for (Map.Entry<String, String> entry : params.entrySet()) {
    builder.queryParam(entry.getKey(), entry.getValue());
}

ResponseEntity<MyEntity[]> response = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, requestEntity, MyEntity[].class);

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

1 Ответ

0 голосов
/ 16 октября 2019

То, что я сделал, создал новый класс RestPageImpl

@JsonIgnoreProperties(ignoreUnknown = true)
public class RestPageImpl<ConfigurationTable> extends PageImpl<ConfigurationTable> {

    private static final long serialVersionUID = -1423116752405536063L;

    @JsonCreator(mode = JsonCreator.Mode.PROPERTIES)
    public RestPageImpl(
            @JsonProperty("content") List<ConfigurationTable> content,
            @JsonProperty("number") int number, @JsonProperty("size") int size,
            @JsonProperty("totalElements") Long totalElements, @JsonProperty("pageable") JsonNode pageable,
            @JsonProperty("last") boolean last, @JsonProperty("totalPages") int totalPages,
            @JsonProperty("sort") JsonNode sort, @JsonProperty("first") boolean first,
            @JsonProperty("numberOfElements") int numberOfElements) {

        super(content, PageRequest.of(number, size), totalElements);
    }

    public RestPageImpl(List<ConfigurationTable> content, Pageable pageable,
            long total) {
            super(content, pageable, total);
        }

        public RestPageImpl(List<ConfigurationTable> content) {
            super(content);
        }

        public RestPageImpl() {
            super(new ArrayList<>());
        }
    }

И на стороне контроллера обновил мой код до:

MyEntity[] responseEntity =null;

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.set("Accept", MediaType.APPLICATION_JSON_VALUE);

// request entity is created with request headers
HttpEntity<MyEntity> requestEntity = new HttpEntity<>(requestHeaders);

Map<String, String> params = new HashMap<>();
params.put("feild1", val1);             
params.put("feild2", val2);             

UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(ApiEndpoint);

for (Map.Entry<String, String> entry : params.entrySet()) {
    builder.queryParam(entry.getKey(), entry.getValue());
}

ParameterizedTypeReference<RestPageImpl<MyEntity>> type = new ParameterizedTypeReference<RestPageImpl<MyEntity>>() {
};
responseEntity = restTemplate.exchange(builder.toUriString(), HttpMethod.GET, requestEntity, type);

И теперь все отлично работает.

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