今日目標
設計一組 RESTful API,讓受檢貴賓在醫院前台能自行登記 Email 與基本資料。同時實作 DTO(資料傳輸物件)與全域例外處理,為後端建立第一道資安與防呆防線。
核心概念:Garbage in, garbage out
在醫療系統中,資料的正確性至關重要。如果病患把身分證字號填錯,或者 Email 漏打一個 @,後續的報告加密與寄發一定會失敗。
因此,我們不能直接相信前端傳來的 JSON 資料。今天我們將運用 Spring Boot 的 Validation 套件,結合 DTO 模式,把所有不合法的資料在 Controller 這一層就直接擋下來,並透過 @ControllerAdvice 統一回傳乾淨的錯誤訊息。
實作重點:DTO 與 Controller 建置
Step 1:
建立 PatientDTO (資料傳輸物件)
在 src/main/java/com/hospital/report_system 底下新增一個資料夾命名為 dto,並在裡面新增 PatientDTO.java。
我們會用到正則表達式(Regex)來精準驗證台灣身分證字號格式。
Step 2:
撰寫 PatientController
在 Day 2 建好的 controller 資料夾底下,新增 PatientController.java,提供讓前端送出資料的 POST 介面。記得在參數前加上 @Valid 才會觸發我們剛寫好的防呆機制。
Step 3:
建立全域例外處理 (GlobalExceptionHandler)
如果驗證失敗,Spring 預設會噴出一大串很醜的錯誤軌跡。我們在 report_system 底下新增一個資料夾命名為 exception,並加入 GlobalExceptionHandler.java 來攔截這些錯誤,轉換成前端看得懂的乾淨 JSON。
最終測試成果:
伺服器成功啟動後,我們打開 Postman,模擬一筆「刻意填錯」的病患資料發送 POST 請求:
{
"name": "張三",
"idNumber": "A123",
"email": "bad-email",
"birthDate": "1990/01/01"
}
伺服器回傳了 400 Bad Request,並且精準地跳出錯誤訊息:
{
"idNumber": "身分證字號格式不正確",
"birthDate": "生日格式必須為 YYYY-MM-DD",
"email": "Email 格式不正確"
}
心得
在實作過程中,因為頻繁調整資料夾結構,導致 VS Code 的 Java 編譯快取壞掉,伺服器啟動時爆出 ClassFormatError: Invalid method Code length 0,完全無法啟動。
解決方案:這時不能只依賴 IDE 的 Clean 功能,必須手動進入專案目錄,將編譯產生的 target 資料夾整個刪除(物理消滅),再確認已安裝 Lombok 擴充套件,重新觸發 Maven clean 與 compile,才順利讓伺服器復活。