Spring Boot 06 - Spring Boot Web 調試工具
之前兩節,都一直在講怎樣寫code,也介紹了Test Case的好。若為初次接觸,Spring有很多設定需要摸索,若開始時就設定錯誤,對不少人來講都會有很大打擊。在這裏,筆者就介紹一些vscode和spring的工具,可以讓IDE多幫忙一下,減少走歪路的機會。
vscode插件
以下兩個插件,都在於提示用戶設定。
- Spring Boot Dashboard (vscjava.vscode-spring-boot-dashboard)
- 可以那它來運作spring boot app,省去找尋main 位置的麻煩
- 綜覽整個程式中的所有Bean (Bean是一個很重要的元素,日後會再提及)
- 若程式為Spring boot web,可以顯示所 http endpoint。
- Spring Boot Tools (vmware.vscode-spring-boot)
- 檢查設定檔的設定值有沒有寫錯 (application*.properties, application*.yml)
- 綜覽檔案中的有以@為首的與spring相關的元素(檔案很大時就會有用)
- 可以在IDE運行spring時,查看@元素的bean資訊 (not works ?, 加了actuator也是沒有看見)
- Spring Initializr(vscjava.vscode-spring-initializr)
- 經網絡初始化spring 專案的依賴引用設定
- Maven for Java (vscjava.vscode-maven)
- 若大家在使用Spring Initializr時,選取了maven作管理工具,那麼這插件就可以在後續幫忙更新引用。
- 若專案的Spring 及㡳層引用有變,vscode也需要它來引用更新。
- 這是java 開發工具包(vscjava)的其中一員,它的其他插件也可以順帶安裝。
調試工具 - open api / swagger-ui
如果我們在開發Web http API ,其實都是為了該某個客戶端使用。但如果該客端明白我們的API該怎樣使用,大家總不會逐個連結,自行編寫使用手冊及範例吧。所以就有了open api 和 swagger-ui 的誕生 。
open api,就是一個公認的使用手冊標準,我們只要在spring-web中加入 springdoc-openapi-starter-webmvc-ui 的程式庫,就可以自動為我們的controller 生成 open api 的說明檔。
更強大的是,這個程式庫可以利用剛生成的open api,配上 swagger-ui ,自動生成一個可供測試的頁面。這個頁面可以供碼農們直接操作,也會產生對應的 curl 指令,讓碼農們可以在任何的主機上重複。這樣,那麼是沒有太多解釋的說明文檔也可以使用。
做法很簡單,在pom.xml中加入依賴。
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.5.0</version>
</dependency>
然後我們就可以加入Controller,運行 Spring 後,我們可以在 http://localhost:8080/swagger-ui/index.html 找到 swagger 的頁面,然後就可以在 ui 上測試API了。
躲在Proxy背後的 swagger
如果你跟筆者一樣,使用 code-server 或 github codespaces ,你就不能很隨意地連接到 8080 端口,只能經過Http Proxy去訪問。這樣 open api的原有的設定就不合用了。
這時我們需要自行修改 open api 的 bean,加入我們真正的根路徑。然後筆者使用 code-server,而IDE只會在port 9000上執行,它對外的前置路徑會是 http://localhost:9000/proxy/8080/。
@Bean
public OpenAPI customOpenAPI() {
Server server = new Server();
server.setUrl("http://localhost:9000/proxy/8080/");
return new OpenAPI().servers(List.of(server));
}
現在訪問 http://localhost:9000/proxy/8080/swagger-ui/index.html,還是會有一些問題,你會看到 "Failed to load remote configuration." 。但你此時可以在 "explore" 搜尋欄位內貼上 http://localhost:9000/proxy/8080/v3/api-docs,再一次搜尋檔案,就回復正常了。
註:如果你熟習Nginx這類Reverse Proxy 的概念,你的環境可以直接修改 Request Header,可以在Proxy中加入X-Forwarded-*,就不用煩惱寫Java Bean了,也不用手動在explore裏重新修正api-docs的位置。詳見 https://springdoc.org/index.html#how-can-i-deploy-springdoc-openapi-starter-webmvc-ui-behind-a-reverse-proxy
Controller的繼承
Spring Controller的 @ 標記 (Annotation) ,其實支援繼承的。經Spring 生成的 api docs,也有如何效果。例如以下程式碼
public class ParentController {
@GetMapping("/postfix")
public String postfix(){
return "this is postfix";
}
}
@RestController
@RequestMapping("/api")
public class ChildController extends ParentController {
@GetMapping("/direct")
public String directCall() {
return "direct result";
}
}
在ChildController的實例中,它會有兩個API,分別是
- /api/direct
- /api/prefix
它支援Java Function Overwrite(覆寫),但不能改 @ 標記,以下就是一個錯的例子
@RestController
@RequestMapping("/api")
public class ChildController extends ParentController {
@GetMapping("/Overwrite") // 把這個 @ 行刪了才能正常執行
public String postfix(){
return "this is Overwrite";
}
}