Feign Client 不解析 Query 参数
Feign Client does not resolve Query parameter
这是我的界面。
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编码?
好像是已经打开的bug导致的-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;
}
}
如最近(2019.04)open feign issue and spring doc说:
The OpenFeign @QueryMap annotation provides support for POJOs to be used as GET parameter maps.
Spring Cloud OpenFeign provides an equivalent @SpringQueryMap annotation, which is used to annotate a POJO or Map parameter as a query parameter map since 2.1.0.
你可以这样使用它:
@GetMapping("user")
String getUser(@SpringQueryMap User user);
public class User {
private String name;
private int age;
...
}
使用 @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 Map<String, String> parameters)
使用下面的 Spring feign 客户端可以正常工作:
@GetMapping("/Groups?filter=displayName+Eq+{roleName}")
SCIMGroup isValidRole(@PathVariable(value = "roleName") String roleName);
这是我的界面。
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编码?
好像是已经打开的bug导致的-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;
}
}
如最近(2019.04)open feign issue and spring doc说:
The OpenFeign @QueryMap annotation provides support for POJOs to be used as GET parameter maps.
Spring Cloud OpenFeign provides an equivalent @SpringQueryMap annotation, which is used to annotate a POJO or Map parameter as a query parameter map since 2.1.0.
你可以这样使用它:
@GetMapping("user")
String getUser(@SpringQueryMap User user);
public class User {
private String name;
private int age;
...
}
使用 @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 Map<String, String> parameters)
使用下面的 Spring feign 客户端可以正常工作:
@GetMapping("/Groups?filter=displayName+Eq+{roleName}")
SCIMGroup isValidRole(@PathVariable(value = "roleName") String roleName);