Skip to content

Commit

Permalink
Add ResponseEntity.of(Optional) variant
Browse files Browse the repository at this point in the history
When dealing with `Optional` values in a Controller handler (for
example, values coming from a Spring Data repository), developers might
reuse this code snippet quite often:

```
@GetMapping("/user")
public ResponseEntity<Optional<User>> fetchUser() {
  Optional<User> user = //...
  return user.map(ResponseEntity::ok).orElse(notFound().build());
}
```

This commit adds a new static method on `ResponseEntity` for that,
simplifying the previous snippet with `return ResponseEntity.of(user);`

Note that in case more specific HTTP response headers are required by
the application, developers should use other static methods to
explicitly tell  which headers should be used in each case.

Issue: SPR-17187
  • Loading branch information
bclozel committed Aug 15, 2018
1 parent d3be1cc commit 432cdd7
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
Expand Up @@ -19,6 +19,7 @@
import java.net.URI;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Optional;
import java.util.Set;

import org.springframework.lang.Nullable;
Expand Down Expand Up @@ -213,6 +214,18 @@ public static BodyBuilder status(int status) {
return new DefaultBuilder(status);
}

/**
* 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
* {@linkplain Optional#empty()} parameter.
* @return the created {@code ResponseEntity}
* @since 5.1
*/
public static <T> ResponseEntity<T> of(Optional<T> body) {
return body.map(ResponseEntity::ok).orElse(notFound().build());
}

/**
* Create a builder with the status set to {@linkplain HttpStatus#OK OK}.
* @return the created builder
Expand Down
@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2018 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.
Expand All @@ -19,6 +19,7 @@
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

import org.hamcrest.Matchers;
Expand Down Expand Up @@ -72,6 +73,25 @@ public void okEntity() {
assertEquals(entity, responseEntity.getBody());
}

@Test
public void ofOptional() {
Integer entity = 42;
ResponseEntity<Integer> responseEntity = ResponseEntity.of(Optional.of(entity));

assertNotNull(responseEntity);
assertEquals(HttpStatus.OK, responseEntity.getStatusCode());
assertEquals(entity, responseEntity.getBody());
}

@Test
public void ofEmptyOptional() {
ResponseEntity<Integer> responseEntity = ResponseEntity.of(Optional.empty());

assertNotNull(responseEntity);
assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode());
assertNull(responseEntity.getBody());
}

@Test
public void createdLocation() throws URISyntaxException {
URI location = new URI("location");
Expand Down

0 comments on commit 432cdd7

Please sign in to comment.