4 回答

TA貢獻(xiàn)1844條經(jīng)驗(yàn) 獲得超8個(gè)贊
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)
如果您的價(jià)值可能null在運(yùn)行時(shí),您可以使用.ofNullable,
jshell> Optional.ofNullable(null)
$3 ==> Optional.empty
ALSO 函數(shù)式編程的思想是為所有輸入返回一個(gè)值,而不是拋出Exception破壞函數(shù)組合的值。
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()其視為未找到的項(xiàng)目,但 Spring 也會(huì)考慮這一點(diǎn),200這仍然比 throw 更好500。您可能希望發(fā)送404準(zhǔn)確。
@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
}
您可以用來(lái)ResponseEntity<A>
設(shè)置特定的 http 狀態(tài)
傳統(tǒng)的響應(yīng)方式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貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
想想這里的類型,如果你要返回Optional,你會(huì)做一個(gè).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"));
我會(huì)解釋:
Optional.ofNullable()
將返回一個(gè)Optional<Compras>
, 具有值Optional("some compras")
或值Optional.Empty
map(Optional::of)
將再次包裝可選的,所以你將擁有Optional[Optional<Compras>]
或(這里的技巧)Optional.Empty,因?yàn)榈貓D不包裝 Optional.Empty(這是他加入我們的原因)最后,
orElseThrow(() -> new RuntimeException("Not found"))
將解壓你的可選,在這種情況下從Optional[Optional<Compras>]
到Optional<Compras>
或者,如果是Optional.Empty
它將拋出異常

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
你的控制器返回Optional<Compras>
。這意味著不會(huì)#get
調(diào)用方法。如果值,您的控制器將返回 null Optional
。
更改為:public Compras retrieveAllCompras...
你會(huì)得到你的例外

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
從對(duì)象名稱和調(diào)用的方法 (?compraRepository.findById(id)
) 來(lái)看,您的服務(wù)實(shí)際上是一個(gè)存儲(chǔ)庫(kù)。如果它是 Spring Data 存儲(chǔ)庫(kù),那么您應(yīng)該將創(chuàng)建留給Optional
Spring Data:?Null Handling of Repository Methods。所以你會(huì)有
compraRepository.findById(id).orElseThrow(NotFoundException::new)
添加回答
舉報(bào)