[英]Spring Boot Optional Path Variables
在我們的 Spring Boot 應用程序中,我們為可選參數使用單獨的端點,如下所示:
// two methods - not recommended
@GetMapping("/todos/{id}")
public @ResponseBody Todo fetchTodoById(@PathVariable Long id) {
return todoRespository.findById(id);
}
@GetMapping("/todos")
public @ResponseBody List<Todo> fetchAllTodos() {
return todoRespository.findAll();
}
我知道這種方法會很快導致大量(幾乎)重復的代碼塊。
為了解決這個問題,我可以使用以下方法之一:
@GetMapping(value = {"/todos", "/todos/{id}"})
public @ResponseBody Object fetchTodos(@PathVariable(required = false) Long id) {
if (id == null) {
return todoRespository.findById(id);
} else {
return todoRespository.findAll();
}
}
以及使用 Java Optional
的類似方式。 但是,即使看起來更好,我認為使用單獨的端點可能會更好。 那么,哪一個是正確的方法?
/todos/{id}
返回一個 ToDo 對象。/todos
返回 ToDo 對象列表。 根據 SOLID 原則,每個類或方法只能做一件事(返回一個對象或對象列表)。 所以你需要分離方法。 我認為使用可選的 pathVariable 是一種不好的做法。我知道這種方法會很快導致大量(幾乎)重復的代碼塊。
好吧,代碼重復並不完全正確。 參數沒有完全分開。 帶有參數的端點指向一個給定的項目,而第二個端點指向一個元素列表。 即使返回類型也不相同,盡管您可能看不到它,因為您返回對象。
因此,第一種方法(2 個不同的端點處理程序)比第二種方法好得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.