我在控制器中使用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]
不确定这是否是管理事物的好方法。
有没有好的实践
答案 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));
}