diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringDecoder.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringDecoder.java index 6651283c..a7d82783 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringDecoder.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/SpringDecoder.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.lang.reflect.WildcardType; import org.springframework.beans.factory.ObjectFactory; import org.springframework.boot.autoconfigure.web.HttpMessageConverters; @@ -47,9 +48,10 @@ public class SpringDecoder implements Decoder { } @Override - public Object decode(final Response response, Type type) throws IOException, - FeignException { - if (type instanceof Class || type instanceof ParameterizedType) { + public Object decode(final Response response, Type type) + throws IOException, FeignException { + if (type instanceof Class || type instanceof ParameterizedType + || type instanceof WildcardType) { @SuppressWarnings({ "unchecked", "rawtypes" }) HttpMessageConverterExtractor extractor = new HttpMessageConverterExtractor( type, this.messageConverters.getObject().getConverters()); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java index 949864da..c01cebf9 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/feign/SpringDecoderTests.java @@ -19,9 +19,11 @@ package org.springframework.cloud.netflix.feign; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; +import java.util.Map; import org.junit.Test; import org.junit.runner.RunWith; @@ -36,6 +38,7 @@ import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @@ -108,6 +111,19 @@ public class SpringDecoderTests extends FeignClientFactoryBean { assertEquals("first hello didn't match", "hello world 1", hellos.get(0)); } + @Test + @SuppressWarnings("unchecked") + public void testWildcardTypeDecode() { + ResponseEntity wildcard = testClient().getWildcard(); + assertNotNull("wildcard was null", wildcard); + assertEquals("wrong status code", HttpStatus.OK, wildcard.getStatusCode()); + Object wildcardBody = wildcard.getBody(); + assertNotNull("wildcardBody was null", wildcardBody); + assertTrue("wildcard not an instance of Map", wildcardBody instanceof Map); + Map hello = (Map) wildcardBody; + assertEquals("first hello didn't match", "wildcard", hello.get("message")); + } + @Test public void testResponseEntityVoid() { ResponseEntity response = testClient().getHelloVoid(); @@ -156,6 +172,9 @@ public class SpringDecoderTests extends FeignClientFactoryBean { @RequestMapping(method = RequestMethod.GET, value = "/hellonotfound") ResponseEntity getNotFound(); + + @GetMapping("/helloWildcard") + ResponseEntity getWildcard(); } @Configuration @@ -199,6 +218,11 @@ public class SpringDecoderTests extends FeignClientFactoryBean { return ResponseEntity.status(HttpStatus.NOT_FOUND).body((String) null); } + @Override + public ResponseEntity getWildcard() { + return ResponseEntity.ok(new Hello("wildcard")); + } + public static void main(String[] args) { new SpringApplicationBuilder(Application.class) .properties("spring.application.name=springdecodertest",