我想从Optional对象构造一个对象,如果Optional对象不存在则抛出异常。
@GetMapping("/{productId}")
public ProductResponse getOneProduct(@PathVariable Long productId) {
Optional<Product> foundProductOpt = productRepository.findById(productId);
return foundProductOpt.map(() ->
new ProductResponse(product, "ok").orElseThrow(() ->
new EntityNotFoundException("Product with id " +
productId + "was not found"));
}
谷歌上搜索似乎我不能以这种方式使用map方法,我希望找到一个使用findById的Product然后将它放入一个foundProductOpt变量然后用找到的Product实例化一个响应对象以及一条消息随之而来。
如何将对象从Optional传递给方法或构造函数,或者如果对象不存在则抛出异常?
答案 0 :(得分:2)
您应该更改此行:
return foundProductOpt
.map(() -> new ProductResponse(product, "ok")
.orElseThrow(() -> new EntityNotFoundException(
"Product with id " + productId + "was not found"));
要:
return foundProductOpt
.map(p -> new ProductResponse(p, "ok"))
.orElseThrow(() -> new EntityNotFoundException(
"Product with id " + productId + "was not found"));
格式化这样的长行正确地提高了可读性。此外,您没有正确使用Optional.map
和Optional.orElseThrow
。
答案 1 :(得分:1)
您不需要映射任何内容。如果不存在就扔掉。以下是我的思考方式:
首先假装Optional是一个真实对象,一切正常。
"..."
然后使用cmd.exe
转换可选项。
return new ProductResponse(foundProductOpt
, "ok");