Skip to content

Commit fe7c258

Browse files
mroccyenvelo
andauthored
Add support for the parameter type corresponding to headerMapIndex for user object (#1581)
* feat: add support for the parameter type corresponding to headerMapIndex for user object * feat: add a resolution of the user pojo object * feat: add a resolution of the user pojo object Co-authored-by: Marvin Froeder <velo@users.noreply.github.com>
1 parent a9750ba commit fe7c258

File tree

4 files changed

+89
-7
lines changed

4 files changed

+89
-7
lines changed

core/src/main/java/feign/Contract.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,10 @@ protected MethodMetadata parseAndValidateMetadata(Class<?> targetType, Method me
156156
}
157157

158158
if (data.headerMapIndex() != null) {
159-
checkMapString(
160-
"HeaderMap",
161-
parameterTypes[data.headerMapIndex()],
162-
genericParameterTypes[data.headerMapIndex()]);
159+
// check header map parameter for map type
160+
if (Map.class.isAssignableFrom(parameterTypes[data.headerMapIndex()])) {
161+
checkMapKeys("HeaderMap", genericParameterTypes[data.headerMapIndex()]);
162+
}
163163
}
164164

165165
if (data.queryMapIndex() != null) {

core/src/main/java/feign/ReflectiveFeign.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,10 @@ public RequestTemplate create(Object[] argv) {
248248
}
249249

250250
if (metadata.headerMapIndex() != null) {
251-
template =
252-
addHeaderMapHeaders((Map<String, Object>) argv[metadata.headerMapIndex()], template);
251+
// add header map parameters for a resolution of the user pojo object
252+
Object value = argv[metadata.headerMapIndex()];
253+
Map<String, Object> headerMap = toQueryMap(value);
254+
template = addHeaderMapHeaders(headerMap, template);
253255
}
254256

255257
return template;

core/src/test/java/feign/DefaultContractTest.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,14 @@ public void headerMapSubclass() throws Exception {
423423
assertThat(md.headerMapIndex()).isEqualTo(0);
424424
}
425425

426+
@Test
427+
public void headerMapUserObject() throws Exception {
428+
final MethodMetadata md =
429+
parseAndValidateMetadata(
430+
HeaderMapInterface.class, "headerMapUserObject", HeaderMapUserObject.class);
431+
assertThat(md.headerMapIndex()).isEqualTo(0);
432+
}
433+
426434
interface Methods {
427435

428436
@RequestLine("POST /")
@@ -522,7 +530,8 @@ Response recordsByNameAndType(
522530
interface AutoDiscoverParamNames {
523531

524532
@RequestLine("GET /domains/{domainId}/records?name={name}&type={type}")
525-
Response recordsByNameAndType(@Param int domainId, @Param String name, @Param() String type);
533+
Response recordsByNameAndType(
534+
@Param("domainId") int domainId, @Param("name") String name, @Param("type") String type);
526535
}
527536

528537
interface FormParams {
@@ -557,6 +566,33 @@ void multipleHeaderMap(
557566

558567
@RequestLine("POST /")
559568
void headerMapSubClass(@HeaderMap SubClassHeaders httpHeaders);
569+
570+
@RequestLine("POST /")
571+
void headerMapUserObject(@HeaderMap HeaderMapUserObject httpHeaders);
572+
}
573+
574+
class HeaderMapUserObject {
575+
@Param("name1")
576+
private String name;
577+
578+
@Param("grade1")
579+
private String grade;
580+
581+
public String getName() {
582+
return name;
583+
}
584+
585+
public void setName(String name) {
586+
this.name = name;
587+
}
588+
589+
public String getGrade() {
590+
return grade;
591+
}
592+
593+
public void setGrade(String grade) {
594+
this.grade = grade;
595+
}
560596
}
561597

562598
interface HeaderParams {

core/src/test/java/feign/FeignTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,23 @@ public void headerMap() throws Exception {
251251
entry("Custom-Header", Arrays.asList("fooValue")));
252252
}
253253

254+
@Test
255+
public void HeaderMapUserObject() throws Exception {
256+
server.enqueue(new MockResponse());
257+
258+
TestInterface api = new TestInterfaceBuilder().target("http://localhost:" + server.getPort());
259+
260+
HeaderMapUserObject headerMap = new HeaderMapUserObject();
261+
headerMap.setName("hello");
262+
headerMap.setGrade("5");
263+
api.HeaderMapUserObject(headerMap);
264+
265+
assertThat(server.takeRequest())
266+
.hasHeaders(
267+
entry("name1", Collections.singletonList("hello")),
268+
entry("grade1", Collections.singletonList("5")));
269+
}
270+
254271
@Test
255272
public void headerMapWithHeaderAnnotations() throws Exception {
256273
server.enqueue(new MockResponse());
@@ -1000,6 +1017,9 @@ void form(
10001017
@RequestLine("GET /")
10011018
void headerMap(@HeaderMap Map<String, Object> headerMap);
10021019

1020+
@RequestLine("GET /")
1021+
void HeaderMapUserObject(@HeaderMap HeaderMapUserObject headerMap);
1022+
10031023
@RequestLine("GET /")
10041024
@Headers("Content-Encoding: deflate")
10051025
void headerMapWithHeaderAnnotations(@HeaderMap Map<String, Object> headerMap);
@@ -1035,6 +1055,30 @@ public String expand(Object value) {
10351055
}
10361056
}
10371057

1058+
class HeaderMapUserObject {
1059+
@Param("name1")
1060+
private String name;
1061+
1062+
@Param("grade1")
1063+
private String grade;
1064+
1065+
public String getName() {
1066+
return name;
1067+
}
1068+
1069+
public void setName(String name) {
1070+
this.name = name;
1071+
}
1072+
1073+
public String getGrade() {
1074+
return grade;
1075+
}
1076+
1077+
public void setGrade(String grade) {
1078+
this.grade = grade;
1079+
}
1080+
}
1081+
10381082
class TestInterfaceException extends Exception {
10391083
TestInterfaceException(String message) {
10401084
super(message);

0 commit comments

Comments
 (0)