Spring Cloud Feign Client @RequestParam with List parameter creates a wrong request

10,869

Solution 1

I had the same issue with multiple occurence of the parametre instead of the expected comma separated sequence of items. The solution was really simple:

In my feign client I used arrays

feignClient.get(new Long[]{1L,2L,3L})

instead of collection/list:

feignClient.get(Arrays.asList(1L,2L,3L))

Solution 2

In Feign you can annotate your controller with the following

@CollectionFormat(feign.CollectionFormat.CSV) and it will process collections in

the CSV format findByIdIn?ids=1&ids=2&ids=3

Solution 3

I've just battled with this today, and the solution for me was surprisingly simple.

If you use brackets [] for denoting query array:

Resources<MyClass> get(@RequestParam("ids[]") List<Long> ids);

it will create a request that looks like this

/search/findByIdIn?ids[]=1&ids[]=2&ids[]=3

Most server side frameworks will interpret this as an array. If your server is also in spring then you can pick this up like this

@GetMapping("/search/findByIdIn")
public ResponseEntity findByIdIn(@RequestParam("ids[]") List<Long> ids) { ... }

Just keep in mind that the query has to be encoded, [] gets encoded to %5B%5D.

Share:
10,869

Related videos on Youtube

Sergey Shcherbakov
Author by

Sergey Shcherbakov

Updated on June 04, 2022

Comments

  • Sergey Shcherbakov
    Sergey Shcherbakov almost 2 years

    I have a Spring Clound Feign Client mapping defined as following

    @RequestMapping(method = RequestMethod.GET, value = "/search/findByIdIn")
    Resources<MyClass> get(@RequestParam("ids") List<Long> ids);
    

    when I call

    feignClient.get(Arrays.asList(1L,2L,3L))
    

    according to what I can see in the debugger, the feign-core library forms the following request:

    /search/findByIdIn?ids=1&ids=2&ids=3
    

    instead of expected

    /search/findByIdIn?ids=1,2,3
    

    which would be correct for the server Spring Data REST endpoint declared in the same way as my Feign client method.

    Thus, because of this issue, the request always returns empty set.

    I have seen similar question, but it looks like the Feign client was working as I expect back in 2015.

    I am using:

    • spring-cloud-starter-feign version 1.2.4.RELEASE
    • feign-httpclient version 9.4.0
    • feign-core version 9.4.0

    Is there a way to correct the behaviour and "marry" the Spring Cloud Feign Client with the Spring Data REST defined endpoints?