Feign Client无法解析查询参数

Bee*_*Bee 6 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);

}
Run Code Online (Sandbox Code Playgroud)

在这里getUser通话效果很好。但是isValidRole无法正常工作,因为最终会这样发送请求。

/Groups?filter=displayName+Eq+{roleName}"
Run Code Online (Sandbox Code Playgroud)

这里{roleName}没有解决。我在这里想念什么?感谢一些帮助,因为我对此一无所知。

编辑:1更多问题:有没有办法避免查询参数的自动url编码?

Fra*_*ang 17

正如最近(2019.04)公开的假装问题spring doc所说的那样?

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

Spring Cloud OpenFeign 提供了一个等效的@SpringQueryMap 注解,从2.1.0 开始用于将POJO 或Map 参数注解为查询参数映射。

你可以这样使用它:

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

  • 如果我在 `User#name` 之上添加了 `@JsonProperty("na-me")` ,那么 feign 是否应该使用编码后的“na-me”参数而不是“name”发出请求?因为我认为应该,但事实并非如此,我不确定我是否应该问一个单独的问题,或者这就是假装的工作原理 (2认同)

Chi*_*asa 7

使用正常工作 @QueryMap

网址:/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)
Run Code Online (Sandbox Code Playgroud)

内部客户端界面

@RequestLine("GET /api/v1/task/search?{parameters}")
List<Task> searchTasks(@QueryMap Map<String, String> parameters)
Run Code Online (Sandbox Code Playgroud)

  • 我真的很喜欢这种方法。`@QueryMap` 对我不起作用,而是用 `@SpringQueryMap` 替换它来完成这项工作。Spring 在使用“@QueryMap”时有一些限制,以供进一步阅读:https://cloud.spring.io/spring-cloud-openfeign/reference/html/#feign-querymap-support (2认同)

yon*_*oon 6

它似乎是由已经打开的错误引起的-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;
    }
}
Run Code Online (Sandbox Code Playgroud)