我有一个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年开始工作。
我正在使用:
是否有办法纠正行为并且&#34;结婚&#34;使用Spring Data REST定义端点的Spring Cloud Feign Client?
答案 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
您也可以参考: