我在控制器中使用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)
不确定这是否是管理事物的好方法.
有什么好的实践吗?
试试这个:
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"意味着:
在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前必须理解并仔细权衡其全部含义.
你错过了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)
| 归档时间: |
|
| 查看次数: |
650 次 |
| 最近记录: |