10

这是我的界面。

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}没有解决。我在这里想念什么?感谢一些帮助,因为我在这一点上一无所知。

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

4

4 回答 4

20

正如最近(2019.04)open feign issuespring doc所说:</p>

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

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

你可以像这样使用它:

    @GetMapping("user")
    String getUser(@SpringQueryMap User user);
public class User {
    private String name;
    private int age;
    ...
}
于 2019-04-30T10:56:10.610 回答
10

这似乎是由已经打开的错误引起的 - 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;
    }
}
于 2017-05-10T04:34:52.553 回答
10

使用工作正常@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)

内部客户端界面

@RequestLine("GET /api/v1/task/search?{parameters}")
List<Task> searchTasks(@QueryMap Map<String, String> parameters)
于 2020-01-03T11:41:53.830 回答
2

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

@GetMapping("/Groups?filter=displayName+Eq+{roleName}")
    SCIMGroup isValidRole(@PathVariable(value = "roleName") String roleName);
于 2021-08-11T12:30:13.570 回答