Как передать список Java в вызове GET, используя Spring RestTemplate для использования в контроллере - PullRequest
0 голосов
/ 27 апреля 2018

Я не могу понять, как передать список Java в вызов Spring RestTemplate, а затем использовать список в методе Controller

Код клиента:

public String generateInfoOfIds(List<String> ids, String userName, String password){
    RestTemplate restTemplate = new RestTemplate();
    String response = null;
    String url = "https://someservice.com/getInfoOfIds?";
    restTemplate.getInterceptors().add(new BasicAuthorizationInterceptor(userName, password));
    response = restTemplate.exchange(url+"ids=" + ids, HttpMethod.GET, null, String.class);
    return response;
}

Код контроллера:

@RequestMapping(value = "/getInfoOfIds", method = RequestMethod.GET)
public String getInfoOfIds(@RequestParam("ids") List<String> ids) {
    String response = myService.doSomeWork(ids);
    return response;
}

Звонок самому контроллеру работает, но он List не конвертирует в идентификаторы @RequestParam правильно.

Как именно вы передаете список из шаблона RestTemplate в контроллер весной?

1 Ответ

0 голосов
/ 27 апреля 2018
response = restTemplate.exchange(url+"ids=" + ids, HttpMethod.GET, null, String.class);

В вашем клиентском коде это должны быть либо значения, разделенные запятыми ( ids = 1,2,3) , либо несколько объединенных значений ( ids = 1 & ids = 2 & ids = 3 ), но вы передаете целый объект restTemplate.exchange в качестве 1-го аргумента, который будет преобразован с помощью метода toString () и будет выглядеть следующим образом ids = [123, 321] , и он отличается от ожидаемого формата.

Решение с отформатированной строкой

JDK> = 8

String idsAsParam = ids.stream()
            .map(Object::toString)
            .collect(Collectors.joining(","));

response = restTemplate.exchange(url+"ids=" + idsAsParam, HttpMethod.GET, null, String.class);

JDK <8 </p>

String idsAsParam = ids.toString()
            .replace(", ", ",")  //remove space after the commas
            .replace("[", "")  //remove the left bracket
            .replace("]", "")  //remove the right bracket
            .trim();           //remove trailing spaces from partially initialized arrays

response = restTemplate.exchange(url + "ids=" + idsAsParam, HttpMethod.GET, null, String.class);

Решение с RestTemplate

Вы также можете сделать трюк, используя функцию сопоставления с образцом UriTemplate. Он хорошо работает с объектом Map в качестве аргумента. Ключ должен совпадать с ключом URI, а значение должно быть массивом, который можно создать из списка. Пример:

String url = "http://google.com";

List<String> params = Arrays.asList("111", "222", "333");

Map<String, Object> map = new HashMap<>();
map.put("ids[]", params.toArray());

restTemplate.exchange(url + "?ids={ids[]}", HttpMethod.GET, null, String.class, map);

Результаты в

"http://google.com?ids=111,222,333"

...