4 回答

TA貢獻1844條經驗 獲得超8個贊
Optional.of期望純值。您也可以在文檔中找到信息,
/**
?* Constructs an instance with the described value.
?*
?* @param value the non-{@code null} value to describe
?* @throws NullPointerException if value is {@code null}
?*/
private Optional(T value) {
? ? this.value = Objects.requireNonNull(value);
}
例子,
jshell> Optional.of(100)
$2 ==> Optional[100]
jshell> Optional.of(null)
|? Exception java.lang.NullPointerException
|? ? ? ? at Objects.requireNonNull (Objects.java:221)
|? ? ? ? at Optional.<init> (Optional.java:107)
|? ? ? ? at Optional.of (Optional.java:120)
|? ? ? ? at (#1:1)
如果您的價值可能null在運行時,您可以使用.ofNullable,
jshell> Optional.ofNullable(null)
$3 ==> Optional.empty
ALSO 函數式編程的思想是為所有輸入返回一個值,而不是拋出Exception破壞函數組合的值。
jshell> Function<Integer, Optional<Integer>> f = x -> Optional.of(x + 1)
f ==> $Lambda$23/0x0000000801171c40@6996db8
jshell> Function<Integer, Optional<Integer>> g = x -> Optional.of(x * 2)
g ==> $Lambda$24/0x0000000801172840@7fbe847c
jshell> f.apply(5).flatMap(x -> g.apply(x))
$13 ==> Optional[12]
因此,在您的示例中,您可以將Optional.empty()其視為未找到的項目,但 Spring 也會考慮這一點,200這仍然比 throw 更好500。您可能希望發送404準確。
@GetMapping(
? value = "/compras",?
? produces = "application/json"
)
public Optional<Compras> retrieveAllCompras(@RequestParam String id) {
? ? return Optional.ofNullable(compraRepository.findById(id)); //will response as 200 even when no item found
}
您可以用來ResponseEntity<A>
設置特定的 http 狀態
傳統的響應方式404
是定義特定的異常。
import org.springframework.web.server.ResponseStatusException;
import org.springframework.http.HttpStatus;
@GetMapping(
? value = "/compras",?
? produces = "application/json"
)
public Compras retrieveAllCompras(@RequestParam String id) {
? ? return Optional.ofNullable(compraRepository.findById(id))
? ? ? ? ? ? ? ? ? ?.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "item not found"))
}

TA貢獻1824條經驗 獲得超6個贊
想想這里的類型,如果你要返回Optional,你會做一個.orElse,你必須重新包裝它。這將是一種方法:
@GetMapping(value = "/compras", produces = "application/json")
public Optional<Compras> retrieveAllCompras(@RequestParam String id) {
return Optional.ofNullable(compraRepository.findById(id)).
map(Optional::of).
orElseThrow(() -> new RuntimeException("Not found"));
我會解釋:
Optional.ofNullable()
將返回一個Optional<Compras>
, 具有值Optional("some compras")
或值Optional.Empty
map(Optional::of)
將再次包裝可選的,所以你將擁有Optional[Optional<Compras>]
或(這里的技巧)Optional.Empty,因為地圖不包裝 Optional.Empty(這是他加入我們的原因)最后,
orElseThrow(() -> new RuntimeException("Not found"))
將解壓你的可選,在這種情況下從Optional[Optional<Compras>]
到Optional<Compras>
或者,如果是Optional.Empty
它將拋出異常

TA貢獻1875條經驗 獲得超3個贊
你的控制器返回Optional<Compras>
。這意味著不會#get
調用方法。如果值,您的控制器將返回 null Optional
。
更改為:public Compras retrieveAllCompras...
你會得到你的例外

TA貢獻1784條經驗 獲得超8個贊
從對象名稱和調用的方法 (?compraRepository.findById(id)
) 來看,您的服務實際上是一個存儲庫。如果它是 Spring Data 存儲庫,那么您應該將創建留給Optional
Spring Data:?Null Handling of Repository Methods。所以你會有
compraRepository.findById(id).orElseThrow(NotFoundException::new)
添加回答
舉報