Используемое вами сопоставление:
customers/{customerId}/getProductsForInvoices/{invoiceIds}
Здесь и customerId, и invoiceIds являются переменными Path.
http://localhost:8030/api/v1/customers/4499/getProductsForInvoices/invoiceIds/
Вы выполняете вызов, содержащий customerId, но не invoiceIds.Либо вы можете передать список вместо invoiceIds как String и прочитать его как String, а затем создать список, разбив список - что будет плохой практикой.
Другой способ - изменить переменную пути - invoiceId на RequestBody.
Обычно переменные пути используются для одиночного идентификатора или, скажем, навигации по некоторым структурированным данным.Если вы хотите работать с группой идентификаторов, рекомендуется передавать их как RequestBody при вызове метода Post, а не как вызов метода Get.
Пример фрагмента кода для REST API (после вызова):
Здесь, скажем, вы пытаетесь передать объект Employee в вызов POST, API REST будет выглядеть примерно так:
@PostMapping("/employees")
Employee newEmployee(@RequestBody Employee newEmployee) {
//.. perform some operation on newEmployee
}
Эта ссылка поможет вам лучше понять, как использовать RequestBody иПеременные пути - https://javarevisited.blogspot.com/2017/10/differences-between-requestparam-and-pathvariable-annotations-spring-mvc.html
https://spring.io/guides/tutorials/rest/