簡體   English   中英

Spring Boot 可選路徑變量

[英]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 對象。
  • Endpoint /todos返回 ToDo 對象列表。 根據 SOLID 原則,每個類或方法只能做一件事(返回一個對象或對象列表)。 所以你需要分離方法。 我認為使用可選的 pathVariable 是一種不好的做法。

我知道這種方法會很快導致大量(幾乎)重復的代碼塊。

好吧,代碼重復並不完全正確。 參數沒有完全分開。 帶有參數的端點指向一個給定的項目,而第二個端點指向一個元素列表。 即使返回類型也不相同,盡管您可能看不到它,因為您返回對象。

因此,第一種方法(2 個不同的端點處理程序)比第二種方法好得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM