Feign Client不解析Query参数

时间:2017-05-09 11:32:21

标签: java http netflix-feign feign

这是我的界面。

public interface SCIMServiceStub {

    @RequestLine("GET /Users/{id}")
    SCIMUser getUser(@Param("id") String id);

    @RequestLine("GET /Groups?filter=displayName+Eq+{roleName}")
    SCIMGroup isValidRole(@Param("roleName") String roleName);

}

此处getUser调用正常。但是isValidRole无法正常工作,因为请求最终会像这样发送。

/Groups?filter=displayName+Eq+{roleName}"

此处{roleName}未解决。我在这里错过了什么?感谢一些帮助,因为我现在还不知道。

修改:还有一个问题:有没有办法避免查询参数的自动网址编码?

4 个答案:

答案 0 :(得分:5)

这似乎是由已经打开的错误引起的 - https://github.com/OpenFeign/feign/issues/424

与评论一样,您可以定义自己的Param.Expander以下内容作为解决方法。

@RequestLine("GET /Groups?filter={roleName}")
String isValidRole(@Param(value = "roleName", expander = PrefixExpander.class) String roleName);

static final class PrefixExpander implements Param.Expander {
    @Override
    public String expand(Object value) {
        return "displayName+Eq+" + value;
    }
}

答案 1 :(得分:2)

使用@QueryMap

可以正常工作

URL: / api / v1 / task / search?status = PENDING&size = 20&page = 0

Map<String, String> parameters = new LinkedHashMap<>()
        parameters.put("status", "PENDING")
        parameters.put("size", "20")
        parameters.put("page", "0")
        def tasks = restClientFactory.taskApiClient.searchTasks(parameters)

内部客户端界面

@RequestLine("GET /api/v1/task/search?{parameters}")
List<Task> searchTasks(@QueryMap parameters)

答案 2 :(得分:1)

最近(2019.04)open feign issuespring doc说:

  

OpenFeign @QueryMap批注支持将POJO用作GET参数映射。

     

Spring Cloud OpenFeign提供了等效的@SpringQueryMap批注,该批注用于从2.1.0版本开始将POJO或Map参数注释为查询参数映射。

您可以像这样使用它:

    @GetMapping("user")
    String getUser(@SpringQueryMap User user);
public class User {
    private String name;
    private int age;
    ...
}

答案 3 :(得分:0)

使用下面的 Spring feign 客户端工作正常:

@GetMapping("/Groups?filter=displayName+Eq+{roleName}")
    SCIMGroup isValidRole(@PathVariable(value = "roleName") String roleName);