如何根据是否存在Optional值返回值?

rob*_*del 1 java

我在控制器中使用Optional

@GetMapping(value = "/address/{id}")
public ResponseEntity<Addresses> getAddressById(@PathVariable("id") Integer id) {

    Optional<Address> address = addressService.getAddressById(id);
    return new ResponseEntity(address.get(), address.isPresent() ? HttpStatus.OK : HttpStatus.NOT_FOUND);
}
Run Code Online (Sandbox Code Playgroud)

实际上,如果没有价值,我会得到

java.util.NoSuchElementException: No value present
    at java.util.Optional.get(Optional.java:135) ~[na:1.8.0_131]
Run Code Online (Sandbox Code Playgroud)

不确定这是否是管理事物的好方法.

有什么好的实践吗?

Ted*_*opp 8

试试这个:

return address.isPresent()
    ? new ResponseEntity(address.get(), HttpStatus.OK)
    : new ResponseEntity(HttpStatus.NOT_FOUND);
Run Code Online (Sandbox Code Playgroud)

使用当前代码,address.get()无论是否存在值,您都在调用.

请注意,对于更具信息性的NOT_FOUND响应(响应代码404),您可能仍应在响应中包含一个正文(我建议的代码不会这样做).从4xx响应代码HTTP规范(RFC 7231)部分:

除了在响应HEAD请求时,服务器应该发送一个表示,其中包含错误情况的解释,以及它是暂时的还是永久的.

根据RFC 2119,关键词"SHOULD"意味着:

在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前必须理解并仔细权衡其全部含义.


And*_*eas 5

你错过了Optionals的流畅品质.把它们想象成一个流:

  @GetMapping(value = "/address/{id}")
  public ResponseEntity<Address> getAddressById(@PathVariable("id") Integer id) {
    return addressService.getAddressById(id)
        .map(ResponseEntity::ok)
        .orElse(new ResponseEntity<Address>(NOT_FOUND));
  }
Run Code Online (Sandbox Code Playgroud)