diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/ResponseEntityDecoder.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/ResponseEntityDecoder.java index bb99b2bc1..713d1cab5 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/ResponseEntityDecoder.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/feign/support/ResponseEntityDecoder.java @@ -39,8 +39,12 @@ public class ResponseEntityDecoder implements Decoder { type = ((ParameterizedType) type).getActualTypeArguments()[0]; Object decodedObject = decoder.decode(response, type); + Class clazz = null; + if (decodedObject != null) { + clazz = decodedObject.getClass(); + } return createResponse( - decodedObject.getClass(), + clazz, decodedObject, response); } @@ -56,9 +60,11 @@ public class ResponseEntityDecoder implements Decoder { headers.put(key, new LinkedList<>(response.headers().get(key))); } - return new ResponseEntity( - clazz.cast(instance), - headers, + T retVal = null; + if (clazz != null && instance != null) { + retVal = clazz.cast(instance); + } + return new ResponseEntity<>(retVal, headers, HttpStatus.valueOf(response.status())); } } \ No newline at end of file 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 5c09e8e25..918fcd294 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 @@ -95,6 +95,17 @@ public class SpringDecoderTests extends FeignClientFactoryBean { assertEquals("first hello didn't match", "hello world 1", hellos.get(0)); } + @Test + public void testResponseEntityVoid() { + ResponseEntity response = testClient().getHelloVoid(); + assertNotNull("response was null", response); + List headers = response.getHeaders().get("X-test-header"); + assertNotNull("headers was null", headers); + assertEquals("headers size was wrong", 1, headers.size()); + String header = headers.get(0); + assertEquals("header was wrong", "myval", header); + } + @Data @AllArgsConstructor @NoArgsConstructor @@ -114,6 +125,9 @@ public class SpringDecoderTests extends FeignClientFactoryBean { @RequestMapping(method = RequestMethod.GET, value = "/hellostrings") public List getHelloStrings(); + + @RequestMapping(method = RequestMethod.GET, value = "/hellovoid") + public ResponseEntity getHelloVoid(); } @Configuration @@ -126,6 +140,11 @@ public class SpringDecoderTests extends FeignClientFactoryBean { return ResponseEntity.ok(new Hello("hello world via response")); } + @Override + public ResponseEntity getHelloVoid() { + return ResponseEntity.noContent().header("X-test-header", "myval").build(); + } + @Override public Hello getHello() { return new Hello("hello world 1");