具有List参数的Spring Cloud Feign Client @RequestParam会创建错误的请求

时间:2017-01-19 14:41:14

标签: spring-cloud spring-cloud-netflix netflix-feign spring-cloud-feign feign

我有一个Spring Clound Feign Client映射定义如下

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

当我打电话

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

根据我在调试器中看到的内容,feign-core库形成以下请求:

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

而非预期

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

对于以与我的Feign客户端方法相同的方式声明的服务器Spring Data REST端点是正确的。

因此,由于此问题,请求始终返回空集。

我见过类似的question,但看起来像Feign客户端正在按照我的预期在2015年开始工作。

我正在使用:

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

是否有办法纠正行为并且&#34;结婚&#34;使用Spring Data REST定义端点的Spring Cloud Feign Client?

4 个答案:

答案 0 :(得分:4)

我遇到了与参数的多次出现相同的问题,而不是预期的逗号分隔的项目序列。解决方案非常简单:

在我的假装客户端中,我使用了数组

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

而不是收集/列表:

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

答案 1 :(得分:1)

我今天刚刚解决了这个问题,对我来说解决方案非常简单。

如果使用方括号 [] 表示查询数组:

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

它将创建一个看起来像这样的请求

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

大多数服务器端框架会将其解释为数组。 如果您的服务器也在春季,那么您可以这样选择

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

请记住,必须对查询进行编码,[] 被编码为 %5B%5D。

答案 2 :(得分:0)

在Feign中,您可以使用以下内容注释控制器

@CollectionFormat(feign.CollectionFormat.CSV),它将处理

中的集合

CSV格式findByIdIn?ids = 1&ids = 2&ids = 3

答案 3 :(得分:0)

感谢 @prola 的回答。

只是为了添加一个明确的例子,@CollectionFormat(feign.CollectionFormat.CSV)注解针对一个方法;你不能全局应用到你的 Feign Client 界面。

所以每个方法都类似于:

@RequestMapping(value = ["/objects"], method = [RequestMethod.GET])
@CollectionFormat(feign.CollectionFormat.CSV)
fun findById(
    @RequestParam(value = "object.id", required = true) id: String,
    @RequestParam(value = "object.fields", required = false) objectFields: List<String> = DEFAULT_FIELDS_LIST,
    @RequestParam(value = "format") format: String = FORMAT,
): ResponseEntity<ObjectsDTO>

结果是

/objects?object.fields=size,weight,location 

代替

/objects?object.fields=size&object.fields=weight&object.fields=location 

您也可以参考: