9

我有一个 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 端点是正确的。

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

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

我在用:

  • spring-cloud-starter-feign 版本 1.2.4.RELEASE
  • feign-httpclient 版本 9.4.0
  • 伪装核心版本 9.4.0

有没有办法纠正行为并将 Spring Cloud Feign Client 与 Spring Data REST 定义的端点“结合”?

4

4 回答 4

10

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

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

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

而不是集合/列表:

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

于 2018-04-11T18:15:44.167 回答
3

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

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

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

于 2020-09-16T15:10:30.020 回答
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.

于 2021-01-04T14:41:51.933 回答
0

感谢@prola的回答。

Just to add an explicit example, @CollectionFormat(feign.CollectionFormat.CSV) annotation targets a method; you can't apply globally to your Feign Client interface.

So each method will be similar to:

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

The result will be

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

instead of

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

You can also refer to:

于 2021-07-07T20:44:59.657 回答