Spring Boot 03:設定寫了卻沒生效?追出 Profile 與覆寫來源
你把 application.properties 改了,重啟後卻還看到舊值。先別急著猜快取:啟動參數、環境變數或另一份設定檔,可能提供了相同 key。這課用 /api/ping 回傳的 service 名稱,把最後生效的設定變成看得見的結果。
先用一個設定物件接住資料
// LabProperties.java
package com.keeponfirst.bootlab;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@Validated
@ConfigurationProperties(prefix = "lab")
public record LabProperties(@NotBlank String label,
@Min(1) @Max(200) int maxTitleLength) {}prefix="lab" 對應 lab.label 與 lab.max-title-length。LabApplication 使用 @EnableConfigurationProperties 註冊這個 record,讓 Spring 可以注入它。@Validated 配合 validation starter,讓空白 label 或超出 1–200 的長度上限在啟動時被拒絕。int 的型別轉換失敗,也不應等到第一個業務請求才發現。
小設定可以用 @Value;一組互相關聯的設定則適合放進 @ConfigurationProperties,集中看型別與限制。本例的 @Max(200) 對應資料表 title 欄位容量;業務預設限制是 80。若只改業務設定、忘記儲存層限制,錯誤會在較晚的位置才出現。
# application.properties
lab.label=boot-lab
lab.max-title-length=80
# application-local.properties
lab.label=local-profileProfile 是一組設定選擇,不是環境自動偵測
local 是這份範例自己取的名字。啟用 local 時,對應的 profile 設定會參與載入;它不會因為電腦在辦公室就自動切成公司環境。應用可能同時啟用多個 profile,實際專案需記錄啟動參數與設定來源,避免兩份設定互相覆蓋而沒人知道。
java -jar target/boot-learning-lab-1.0.0.jar --spring.profiles.active=local
# Stop this process before starting the next one.
LAB_LABEL=from-env java -jar target/boot-learning-lab-1.0.0.jar --spring.profiles.active=local
# Stop again.
LAB_LABEL=from-env java -jar target/boot-learning-lab-1.0.0.jar --spring.profiles.active=local --lab.label=from-cli在這個沒有其他設定來源的小實驗中,三次 ping 預期依序回傳 local-profile、from-env、from-cli。命令列比環境變數優先,環境變數又覆寫這裡的設定檔。這只是本例用到的相對順序;測試屬性、外部設定路徑與其他來源也有自己的優先權,正式除錯仍須查完整規則。
動手:不要直接把答案抄進設定檔
先不執行,預測「local profile+LAB_LABEL=A+--lab.label=B」會回傳什麼,再用 curl 驗證。接著改成 --lab.max-title-length=0。預期第二次啟動失敗,因為設定驗證擋住不合法值;它不應靜默退回 80。如果沒出現預期結果,先看是否仍在呼叫上一個程序。
答案:B;但你還要能指出來源
只記住 B 還不夠。要能說出 main 收到 args、Boot 整理來源、LabProperties 綁定與驗證,再由 Controller 讀 label 的路徑。這樣回公司遇到 URL 或 timeout 不生效時,才能查到真正控制那個值的位置。
資料庫密碼不要放進可下載教學或提交到 repo,也不要為了除錯把所有設定值整包印出來。EAP 管理的 DataSource、listener 與連線池有自己的設定位置;application.properties 並不擁有每一項執行環境設定。
下載本系列完整工單 API 範例(ZIP)下一課:04:HTTP、驗證與錯誤契約