我對在我的 RestAPI Spring 應用程式中使用 Optionals 設計存盤庫 -> 服務 -> 控制器通信的方式感到困惑。例如,客戶想通過 id 查找電影,但電影不存在并且存盤庫回傳空可選。我有兩種處理方法:
服務方法回傳可選值或拋出例外,可以使用 ControllerAdvice 在 Controller 中處理。
服務回傳 Optional 并且 Controller 處理它(回傳值如果存在或處理例外,或者只是做其他事情)。
我知道在這種簡單情況下使用例外不是最佳實踐,可能您可能會建議其他方式讓客戶知道 id 是錯誤的。
目前 RestController 中的方法:
@GetMapping("/{id}")
public FilmGetDto getFilm(@PathVariable int id) {
return filmService.getFilm(id);
}
uj5u.com熱心網友回復:
我遵循或看到人們所做的大多數遵循的實踐是您應該在服務中處理它并使用包裝類進行回應。通過這種方式,您將實作兩件事,即您將擁有一個可以在所有應用程式中使用的常量 Response 物件,并且您可以非常輕松地使用例外等。您應該始終將服務層中任何尋求的業務邏輯作為 MVC 狀態處理。我在這里發布一個示例,以便您可以更好地理解我在這里想說的內容。
控制器:
@GetMapping("/{id}")
public Response getFilm(@PathVariable int id) {
return filmService.getFilm(id);
}
服務:
public response getFilm(int id){
Optional<Film> film = repo.findById(id);
if(film.isPresent()){
return Response.builder().status(200).data(fim.get()).message("request successful");
}else{
return Response.builder().status(422).data(null).message("Film with given id not found");
}
}
和 Response 類也像@Adrash 所建議的那樣
class Response {
private int status;
private object data;
private String message;
//you can use lombok or IDE generate getter setters to generate getters setters
}
注意:我使用 lombok builder 方法在服務層創建回應物件。
uj5u.com熱心網友回復:
如果您想向客戶端發送有關此類 id 不存在的訊息,則必須處理此類邊緣情況。如果 optional.isPresent() 回傳 false,您可能可以使用 Optional 并處理,您可以發送自定義訊息并讓您的客戶知道不存在具有此類 ID 的資料。
您可以使用包裝類來實作這一點。
class ErrorResponse {
private String status;
private int statusCode;
private String message;
public ErrorResponse(String status, int statusCode, String message){
this.status = status;
-----
-----
}
}
設定此欄位并回傳此類物件作為回應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340203.html
上一篇:無法除錯本地CLI專案
