【问题标题】:Feign Client does not resolve Query parameterFeign Client 不解析 Query 参数
【发布时间】:2017-10-07 16:44:36
【问题描述】:

这是我的界面。

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编码?

【问题讨论】:

    标签: java http netflix-feign feign


    【解决方案1】:

    最近(2019.04)open feign issue和spring doc说:

    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;
        ...
    }
    

    【讨论】:

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

    好像是已经打开的bug导致的——https://github.com/OpenFeign/feign/issues/424

    就像在 cmets 中一样,您可以定义自己的 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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      使用@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)
      

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-22
        • 2021-12-17
        • 2020-05-01
        • 2016-05-17
        • 2021-03-26
        • 2019-09-25
        • 2020-03-25
        • 2020-06-29
        相关资源
        最近更新 更多