У меня есть служба Spring Boot 2 с методом
@RequestMapping(path = "/usable/search")
public List<Provider> findUsable(
@RequestParam(name = "country-id", required = false) Integer countryId,
@RequestParam(name = "network-ids[]", required = false) List<Integer> networkIds,
@RequestParam(name = "usages[]") Set<Usage> usages)
Я хочу вызвать эту службу из другой службы Spring Boot. Для этого я делаю
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
val response =
restTemplate.exchange(
"http://castor-v2/providers/usable/search?network-ids[]={0}&usages[]={1}",
HttpMethod.GET,
new HttpEntity<Long>(httpHeaders),
new ParameterizedTypeReference<List<Provider>>() {},
Collections.singletonList(networkId),
Collections.singleton(Usage.MESSAGE_DELIVERY));
Это генерирует http-запрос, такой как search?network-ids[]=[428]&usages[]=[MESSAGE_DELIVERY]
, который является неправильным (сервер бомбит с org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.List'; nested exception is java.lang.NumberFormatException: For input string: "[573]"
); правильно будет search?network-ids[]=77371&usages[]=MESSAGE_DELIVERY
.
Скорее всего, шаблон URI неправильный. Как следует использовать с коллекциями Java?
Обновление : я создал новую конечную точку API без скобок и использовал UriComponentsBuilder
, как предложено @ vatsal.