跳至正文

Properties ↔ YAML Converter

用於轉換Spring Boot的application.propertiesapplication.yml檔案的工具。配置檔案遷移和重構必備!

📄 Properties → YAML

Output will appear here...

💡 Spring Boot Configuration Tips

Properties 장점:
  • 간단하고 직관적
  • 한 줄에 하나의 설정
  • 검색하기 쉬움
YAML 장점:
  • 계층 구조가 명확
  • 중복 줄임
  • 가독성 좋음
주의사항:
  • YAML은 들여쓰기에 민감 (스페이스만 사용)
  • Properties는 특수문자 이스케이프 필요
  • Profile별 파일 분리 권장

Properties vs YAML

Properties格式

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
server.port=8080

YAML格式

spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret
server:
port: 8080

何時使用?

Properties → YAML轉換

  • 將專案遷移到YAML時
  • 想要清楚地看到層級結構時
  • 想要減少重複前綴時
  • 想要提高可讀性時

YAML → Properties轉換

  • 與舊系統的相容性
  • 偏好簡單配置
  • 更容易搜尋和grep
  • IDE自動補全效果更好

實際使用範例

資料庫配置

Properties:

# Database Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

YAML:

# Database Configuration
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb
username: root
password: secret123
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true

伺服器 & 日誌配置

Properties:

server.port=8080
server.servlet.context-path=/api
server.compression.enabled=true

logging.level.root=INFO
logging.level.com.example=DEBUG
logging.file.name=logs/application.log
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n

YAML:

server:
port: 8080
servlet:
context-path: /api
compression:
enabled: true

logging:
level:
root: INFO
com.example: DEBUG
file:
name: logs/application.log
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss} - %msg%n'

複雜屬性

Properties:

spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=my-group
spring.kafka.consumer.auto-offset-reset=earliest
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer

YAML:

spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: my-group
auto-offset-reset: earliest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

Properties與YAML比較

✅ Properties優點

  1. 簡單: 一行一個設定
  2. 易於搜尋: 使用grep輕鬆查找
  3. 熟悉: 舊的Java標準
  4. 特殊字元: 易於轉義

✅ YAML優點

  1. 可讀性: 層級結構清晰
  2. 減少重複: 省略公共前綴
  3. 註解: 更靈活的註解
  4. 列表: 可以表達陣列

⚠️ Properties缺點

  • 重複較多
  • 難以理解層級結構
  • 複雜配置變得冗長

⚠️ YAML缺點

  • 對縮排敏感
  • 不能使用定位字元(僅空格)
  • 解析錯誤難以除錯

在Spring Boot中的差異

設定檔使用

Properties:

# application.properties (公共)
app.name=MyApp

# application-dev.properties (開發)
spring.datasource.url=jdbc:mysql://localhost:3306/dev_db

# application-prod.properties (生產)
spring.datasource.url=jdbc:mysql://prod-server:3306/prod_db

YAML (在一個檔案中區分設定檔):

app:
name: MyApp

---
spring:
config:
activate:
on-profile: dev
datasource:
url: jdbc:mysql://localhost:3306/dev_db

---
spring:
config:
activate:
on-profile: prod
datasource:
url: jdbc:mysql://prod-server:3306/prod_db

列表/陣列表達

Properties (使用索引):

app.servers[0]=server1.example.com
app.servers[1]=server2.example.com
app.servers[2]=server3.example.com

YAML (原生陣列):

app:
servers:
- server1.example.com
- server2.example.com
- server3.example.com

Map結構

Properties:

app.config.key1=value1
app.config.key2=value2
app.config.key3=value3

YAML:

app:
config:
key1: value1
key2: value2
key3: value3

使用技巧

1. 漸進式遷移

# 1. 備份現有properties
cp application.properties application.properties.bak

# 2. 轉換為YAML
# (使用此工具)

# 3. 建立application.yml

# 4. 測試後刪除properties

2. 設定檔分離

# application.yml (僅公共設定)
app:
name: MyApp

# application-dev.yml (開發環境)
# application-prod.yml (生產環境)

3. 敏感資訊使用環境變數

spring:
datasource:
password: ${DB_PASSWORD} # 使用環境變數

4. 利用IDE外掛程式

  • IntelliJ IDEA: Spring Boot支援
  • VS Code: Spring Boot Extension Pack
  • 利用自動補全和驗證功能

注意事項

撰寫YAML時

# ❌ 錯誤範例 (使用定位字元)
spring:
datasource: # 使用定位字元 - 錯誤!

# ✅ 正確範例 (使用空格)
spring:
datasource: # 2個空格

特殊字元處理

Properties:

# 用反斜線轉義特殊字元
app.message=Hello\nWorld
app.path=C:\\Users\\Example

YAML:

# 用引號包裹
app:
message: "Hello\nWorld"
path: "C:\\Users\\Example"

數字和布林值

Properties:

server.port=8080
app.enabled=true

YAML (自動類型轉換):

server:
port: 8080 # 識別為數字
port: "8080" # 保持為字串
app:
enabled: true # boolean
enabled: "true" # 字串

疑難排解

轉換後出現錯誤

  1. 檢查YAML縮排

    • 使用2個空格
    • 檢查是否有定位字元
  2. 檢查特殊字元

    • 用引號包裹:, #, @
  3. 檢查類型

    • 驗證數字和布林值是否按預期轉換
  4. 檢查設定檔設定

    • spring.profiles.active配置

相關工具

附加資源

最佳實務

1. 按環境分離

application.yml          # 公共設定
application-dev.yml # 開發環境
application-test.yml # 測試環境
application-prod.yml # 生產環境

2. 外部化敏感資訊

spring:
datasource:
password: ${DB_PASSWORD:defaultPassword}

3. 使用註解

# Database Configuration
# 生產環境需要單獨配置
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb

4. 一致的命名

# 推薦kebab-case
spring:
data-source: # ✅
driver-class-name: ...

# 避免camelCase
spring:
dataSource: # ❌
driverClassName: ...