Spring Cloud Feign Client @RequestParam with List parameter 创建了一个错误的请求

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

我有一个 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

这对服务器来说是正确的Spring 数据 REST 端点声明方式与我的 Feign 客户端方法相同。

因此,由于这个问题,请求总是 returns 空集。

我见过类似的 ,但看起来 Feign 客户端在 2015 年的时候就像我预期的那样工作。

我正在使用:

有没有办法纠正 "marry" 具有 Spring Data REST 定义的端点的 Spring Cloud Feign 客户端?

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

在我的 feign 客户端中我使用了数组

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

而不是collection/list:

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

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

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

中的集合

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

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

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

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

它将创建一个如下所示的请求

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

大多数服务器端框架会将其解释为一个数组。 如果你的服务器也在 spring 那么你可以这样选择

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

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

感谢 @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 

您还可以参考: