From f7418704de4f68dfdb3c8c2b7f050e952d2909cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Thu, 2 Feb 2023 16:39:05 +0100 Subject: [PATCH] Add ResponseEntity.ofNullable() To deal with non-Optional nullable objects. Closes gh-29117 --- .../springframework/http/ResponseEntity.java | 18 +++++++- .../http/ResponseEntityTests.java | 22 ++++++++- .../http/KotlinResponseEntityTests.kt | 46 +++++++++++++++++++ 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 spring-web/src/test/kotlin/org/springframework/http/KotlinResponseEntityTests.kt diff --git a/spring-web/src/main/java/org/springframework/http/ResponseEntity.java b/spring-web/src/main/java/org/springframework/http/ResponseEntity.java index 38321c8da52..460d80b1126 100644 --- a/spring-web/src/main/java/org/springframework/http/ResponseEntity.java +++ b/spring-web/src/main/java/org/springframework/http/ResponseEntity.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -68,6 +68,7 @@ import org.springframework.util.ObjectUtils; * * @author Arjen Poutsma * @author Brian Clozel + * @author Sebastien Deleuze * @since 3.0.2 * @param the body type * @see #getStatusCode() @@ -284,6 +285,21 @@ public class ResponseEntity extends HttpEntity { }; } + /** + * A shortcut for creating a {@code ResponseEntity} with the given body + * and the {@linkplain HttpStatus#OK OK} status, or an empty body and a + * {@linkplain HttpStatus#NOT_FOUND NOT FOUND} status in case of a + * {@code null} parameter. + * @return the created {@code ResponseEntity} + * @since 6.0.5 + */ + public static ResponseEntity ofNullable(@Nullable T body) { + if (body == null) { + return notFound().build(); + } + return ResponseEntity.ok(body); + } + /** * Create a new builder with a {@linkplain HttpStatus#CREATED CREATED} status * and a location header set to the given URI. diff --git a/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java b/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java index dacfad7b8fd..7a0d51b4f08 100644 --- a/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java +++ b/spring-web/src/test/java/org/springframework/http/ResponseEntityTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Arjen Poutsma * @author Marcel Overdijk * @author Kazuki Shimizu + * @author Sebastien Deleuze */ class ResponseEntityTests { @@ -90,6 +91,25 @@ class ResponseEntityTests { assertThat(responseEntity.getBody()).isNull(); } + @Test + void ofNullable() { + Integer entity = 42; + ResponseEntity responseEntity = ResponseEntity.ofNullable(entity); + + assertThat(responseEntity).isNotNull(); + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat((int) responseEntity.getBody()).isEqualTo((int) entity); + } + + @Test + void ofNullNullable() { + ResponseEntity responseEntity = ResponseEntity.ofNullable(null); + + assertThat(responseEntity).isNotNull(); + assertThat(responseEntity.getStatusCode()).isEqualTo(HttpStatus.NOT_FOUND); + assertThat(responseEntity.getBody()).isNull(); + } + @Test void createdLocation() { URI location = URI.create("location"); diff --git a/spring-web/src/test/kotlin/org/springframework/http/KotlinResponseEntityTests.kt b/spring-web/src/test/kotlin/org/springframework/http/KotlinResponseEntityTests.kt new file mode 100644 index 00000000000..a6afd51c972 --- /dev/null +++ b/spring-web/src/test/kotlin/org/springframework/http/KotlinResponseEntityTests.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2002-2023 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.http + +import org.assertj.core.api.Assertions +import org.junit.jupiter.api.Test + +/** + * Kotlin tests for [ResponseEntity]. + * + * @author Sebastien Deleuze + */ +class KotlinResponseEntityTests { + + @Test + fun ofNullable() { + val entity = 42 + val responseEntity = ResponseEntity.ofNullable(entity) + Assertions.assertThat(responseEntity).isNotNull() + Assertions.assertThat(responseEntity.statusCode).isEqualTo(HttpStatus.OK) + Assertions.assertThat(responseEntity.body as Int).isEqualTo(entity) + } + + @Test + fun ofNullNullable() { + val responseEntity = ResponseEntity.ofNullable(null) + Assertions.assertThat(responseEntity).isNotNull() + Assertions.assertThat(responseEntity.statusCode).isEqualTo(HttpStatus.NOT_FOUND) + Assertions.assertThat(responseEntity.body).isNull() + } + +}