diff --git a/CHANGELOG.md b/CHANGELOG.md index 2aa1cffcd1..d0da6162cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +### Version 9.1 +* Allows query parameters to match on a substring. Ex `q=body:{body}` + ### Version 9.0 * Migrates to maven from gradle * Changes maven groupId to `io.github.openfeign` diff --git a/core/src/main/java/feign/Contract.java b/core/src/main/java/feign/Contract.java index d15b97120f..fcc52a1668 100644 --- a/core/src/main/java/feign/Contract.java +++ b/core/src/main/java/feign/Contract.java @@ -258,7 +258,7 @@ protected boolean processAnnotationsOnParameter(MethodMetadata data, Annotation[ isHttpAnnotation = true; String varName = '{' + name + '}'; if (data.template().url().indexOf(varName) == -1 && - !searchMapValuesContainsExact(data.template().queries(), varName) && + !searchMapValuesContainsSubstring(data.template().queries(), varName) && !searchMapValuesContainsSubstring(data.template().headers(), varName)) { data.formParams().add(name); } @@ -276,22 +276,6 @@ protected boolean processAnnotationsOnParameter(MethodMetadata data, Annotation[ return isHttpAnnotation; } - private static boolean searchMapValuesContainsExact(Map> map, - V search) { - Collection> values = map.values(); - if (values == null) { - return false; - } - - for (Collection entry : values) { - if (entry.contains(search)) { - return true; - } - } - - return false; - } - private static boolean searchMapValuesContainsSubstring(Map> map, String search) { Collection> values = map.values(); diff --git a/core/src/test/java/feign/DefaultContractTest.java b/core/src/test/java/feign/DefaultContractTest.java index 6fa63bd263..685dbbb619 100644 --- a/core/src/test/java/feign/DefaultContractTest.java +++ b/core/src/test/java/feign/DefaultContractTest.java @@ -770,4 +770,19 @@ public void defaultMethodsOnInterfaceIgnored() throws Exception { MethodMetadata md = mds.get(0); assertThat(md.configKey()).isEqualTo("DefaultMethodOnInterface#get(String)"); } + + interface SubstringQuery { + @RequestLine("GET /_search?q=body:{body}") + String paramIsASubstringOfAQuery(@Param("body") String body); + } + + @Test + public void paramIsASubstringOfAQuery() throws Exception { + List mds = contract.parseAndValidatateMetadata(SubstringQuery.class); + + assertThat(mds.get(0).template().queries()).containsExactly( + entry("q", asList("body:{body}")) + ); + assertThat(mds.get(0).formParams()).isEmpty(); // Prevent issue 424 + } }