web-dev-qa-db-ja.com

Feign Clientがクエリパラメータを解決しない

これが私のインターフェースです。

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エンコードを回避する方法はありますか?

6
Bee

すでに開いているバグが原因であるようです- 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;
    }
}
7
yongsung.yoon

最近(2019.04) 未解決の問題 および 春のドキュメント と言う:

OpenFeign @QueryMapアノテーションは、GETパラメータマップとして使用されるPOJOのサポートを提供します。

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;
    ...
}
6
Frank.Chang

@QueryMapを使用して正常に動作

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

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