diff --git a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java index 683e8a3a1ce..5e291231118 100644 --- a/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java +++ b/spring-web-reactive/src/main/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandler.java @@ -149,6 +149,10 @@ public class ResponseEntityResultHandler extends AbstractMessageWriterResultHand .filter(entry -> !responseHeaders.containsKey(entry.getKey())) .forEach(entry -> responseHeaders.put(entry.getKey(), entry.getValue())); } + if(httpEntity.getBody() == null) { + exchange.getResponse().setComplete(); + return Mono.empty(); + } String etag = entityHeaders.getETag(); Instant lastModified = Instant.ofEpochMilli(entityHeaders.getLastModified()); diff --git a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java index dc18eb21292..97eeef21bd9 100644 --- a/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java +++ b/spring-web-reactive/src/test/java/org/springframework/web/reactive/result/method/annotation/ResponseEntityResultHandlerTests.java @@ -65,6 +65,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.springframework.core.ResolvableType.forClassWithGenerics; import static org.springframework.http.ResponseEntity.ok; +import static org.springframework.http.ResponseEntity.notFound; /** * Unit tests for {@link ResponseEntityResultHandler}. When adding a test also @@ -168,6 +169,16 @@ public class ResponseEntityResultHandlerTests { assertNull(this.response.getBody()); } + @Test + public void handleResponseEntityWithNullBody() throws Exception { + Object returnValue = Mono.just(notFound().build()); + ResolvableType returnType = forClassWithGenerics(Mono.class, responseEntity(String.class)); + HandlerResult result = handlerResult(returnValue, returnType); + this.resultHandler.handleResult(this.exchange, result).block(Duration.ofSeconds(5)); + assertEquals(HttpStatus.NOT_FOUND, this.response.getStatusCode()); + assertNull(this.response.getBody()); + } + @Test public void handleReturnTypes() throws Exception { Object returnValue = ok("abc");