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

时间:2017-07-10 16:02:03

标签: 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);
}

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

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

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

有没有好的实践

2 个答案:

答案 0 :(得分:8)

试试这个:

return address.isPresent()
    ? new ResponseEntity(address.get(), HttpStatus.OK)
    : new ResponseEntity(HttpStatus.NOT_FOUND);

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

请注意,对于更具信息性的NOT_FOUND响应(响应代码404),您可能仍应在响应中包含一个正文(我建议的代码不会这样做)。来自HTTP spec (RFC 7231) section on 4xx response codes

  

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

根据RFC 2119,关键词&#34; SHOULD&#34;的意思是:

  

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

答案 1 :(得分: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));
  }