我想呼叫一個端點,它需要一個字串作為引數并回傳一些狀態,但問題是,有時我需要第二次呼叫這個端點,如果第一次呼叫初始引數失敗。
例如,服務A以returnId="123"呼叫服務B,但是服務B回傳404,那么我希望以id="abc"再次呼叫服務B。(這樣就可以保證我有一些狀態。)
我想知道我是否可以呼叫B服務,并使用id="abc"。
我想知道我是否可以用Optionals而不是用大量的try/catch和if/else塊來實作。
以下是我的想法:
private String fetchStatus(Order order){
var status = Optional.ofNullable(order.getReturnId())。
.map(returnId -> getStatus(order.returnId))
.orElseGet(() -> getStatus(order.getId()))。
log.info("當前狀態:{}", status)。
return status。
}
private String getStatus(String id) {
try {
return externalService.getOrderStatus(id)。
} catch (Exception e) {
throw new IllegalStateException("Failed to fetch status for order.", e) 。
}
上述代碼的問題是,如果服務B(externalService)回傳404未找到,我的代碼從未嘗試呼叫替代方案(orElseGet)。
我到底是哪里出了問題,沒有正確理解呢?
uj5u.com熱心網友回復:
回傳null而不是拋出例外,這樣你的Optional.ofNullabe就會生效。
private String getStatus(String id) {
try {
return externalService.getOrderStatus(id)。
} catch (Exception e) {
//log something so you knowwo what happened[/span]。
return null;
}
如果這在一般情況下是一個好方法,那就是另一回事了。
uj5u.com熱心網友回復:
另一種方法是讓externalService#getOrderStatus(...)回傳一個Optional<String>而不是拋出一個例外,這將使#fetchStatus(...)看起來像這樣:
private String fetchStatus(Order order) {
var status = Optional.ofNullable(order.getReturnId()
.flatMap(externalService::getOrderStatus)
.or(() -> externalService.getOrderStatus(order.getId()))
.orElseThrow(() -> new IllegalStateException("根據你的問題不應該發生"))。
log.info("當前狀態:{}"/span>, status)。
return status。
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/320003.html
標籤:
