Spring ResponseEntity 用于选项

Rob*_*ber 8 spring spring-web

我在代码中经常使用的结构如下:

@RestController
public class HelloController {
  @Autowired
  private HelloService helloService;

  @GetMapping("/hello")
  ResponseEntity<Message> getHelloMessage() {
    Optional<Message> message = helloService.getMessage();
    if (message.isPresent()) {
      return ResponseEntity.ok(message.get());
    }
    return new ResponseEntity(HttpStatus.NO_CONTENT);
  }
}
Run Code Online (Sandbox Code Playgroud)

遵循 DRY 原则,我通过以下方式抽象了这个结构:

private <T> ResponseEntity<T> response(Optional<T> value) {
  if (value.isPresent()) {
    return ResponseEntity.ok(value.get());
  }
  return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
Run Code Online (Sandbox Code Playgroud)

这样我的代码就变成了;

  @GetMapping("/hello")
  ResponseEntity<Message> getHelloMessage() {
    return response(helloService.getMessage());
  }
Run Code Online (Sandbox Code Playgroud)

如果这个构造是 spring 的 ResponseEntity 类的一部分,那就太好了,这样我的代码就变成了;

 @GetMapping("/hello")
 ResponseEntity<Message> getHelloMessage() {
   return ResponseEntity.optional(helloService.getMessage());
 }
Run Code Online (Sandbox Code Playgroud)

您认为在 ResponseEntity 上实现这样的方法是个好主意吗?

Ami*_*ein 13

我知道OP要求NO_CONTENT响应,但如果你在NOT_FOUND之后,你有一个自Spring 5.1以来的便捷方法 - ResponseEntity.of()

 @GetMapping("/hello")
 ResponseEntity<Message> getHelloMessage() {
   return ResponseEntity.of(helloService.getMessage());
 }

Run Code Online (Sandbox Code Playgroud)

如果您需要 NO_CONTENT 我可以建议以下稍微不那么冗长的内容:

 @GetMapping("/hello")
 ResponseEntity<Message> getHelloMessage() {
        return helloService.getMessage()
                .map(ResponseEntity::ok)
                .orElseGet(() -> ResponseEntity.noContent().build());
 }

Run Code Online (Sandbox Code Playgroud)