24 Properties und YAML

Jede Anwendung braucht Konfiguration. Ports, Datenbankverbindungen, Feature-Flags, Timeouts. Spring Boot bietet zwei Formate dafür: Properties und YAML. Beide erreichen dasselbe – die Wahl ist Geschmackssache.

24.1 Zwei Formate, ein Zweck

Properties-Format – das klassische Java-Format:

# application.properties
server.port=8080
spring.application.name=arcade-highscore-api
spring.data.mongodb.uri=mongodb://localhost:27017/arcade

YAML-Format – strukturierter und lesbarer:

# application.yaml
server:
  port: 8080

spring:
  application:
    name: arcade-highscore-api
  data:
    mongodb:
      uri: mongodb://localhost:27017/arcade

Der Inhalt ist identisch. YAML nutzt Einrückung statt Punkte für Hierarchien. Bei tief verschachtelten Konfigurationen wird der Unterschied deutlich:

# Properties: Wiederholung
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=300000
# YAML: Gruppierung
spring:
  datasource:
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      idle-timeout: 300000

Das Arcade-Projekt verwendet YAML. Für neue Projekte ist das die übliche Wahl.

24.2 Wo die Dateien liegen

Spring Boot sucht Konfigurationsdateien an bestimmten Orten:

Höhere Priorität überschreibt niedrigere. Eine application.yaml im aktuellen Verzeichnis überschreibt die im JAR.

Für das Arcade-Projekt liegt die Datei im Standard-Ort:

src/main/resources/
└── application.yaml

Beim Build wird sie ins JAR gepackt. Zur Laufzeit kann sie von außen überschrieben werden.

24.3 Was konfiguriert werden kann

Spring Boot kennt hunderte Properties. Die wichtigsten Kategorien:

Präfix Bereich Beispiele
server.* HTTP-Server Port, Context-Path, SSL
spring.datasource.* Datenbanken URL, Credentials, Pool
spring.data.* Data-Module MongoDB, Redis, JPA
spring.mvc.* Web MVC View-Resolver, Formatierung
logging.* Logging Level, Patterns, Dateien
management.* Actuator Endpoints, Metriken

Die vollständige Liste steht in der Spring Boot Dokumentation unter “Common Application Properties”.

24.4 Typische Konfiguration

Eine typische application.yaml für das Arcade-Projekt:

# Anwendungsname - erscheint in Logs und Monitoring
spring:
  application:
    name: arcade-highscore-api

# Server-Konfiguration
server:
  port: 8080

# Logging - mehr Details für eigenen Code
logging:
  level:
    de.digitalfrontiers.arcade: DEBUG
    org.springframework.web: INFO

# Später: Datenbank
# spring:
#   data:
#     mongodb:
#       uri: mongodb://localhost:27017/arcade

Kommentare mit # dokumentieren die Absicht. Auskommentierte Blöcke zeigen zukünftige Erweiterungen.

24.5 YAML-Syntax Grundlagen

YAML hat Eigenheiten, die Einsteiger stolpern lassen:

Einrückung zählt – immer Leerzeichen, nie Tabs:

# RICHTIG
server:
  port: 8080    # 2 Leerzeichen Einrückung

# FALSCH - Tab statt Leerzeichen
server:
    port: 8080    # Parser-Fehler!

Strings meist ohne Anführungszeichen:

spring:
  application:
    name: arcade-api         # Funktioniert
    name: "arcade-api"       # Auch ok
    name: 'arcade-api'       # Auch ok

Anführungszeichen bei Sonderzeichen:

# FALSCH - Doppelpunkt verwirrt Parser
message: Achtung: Fehler

# RICHTIG
message: "Achtung: Fehler"

Listen mit Bindestrich:

# Liste von Werten
my-app:
  allowed-origins:
    - http://localhost:3000
    - http://localhost:5173
    - https://arcade.example.com

24.6 Umgebungsvariablen

Properties können durch Umgebungsvariablen überschrieben werden. Spring Boot wandelt automatisch um:

Property:              server.port
Umgebungsvariable:     SERVER_PORT

Die Regeln: - Punkte werden zu Unterstrichen - Alles wird Großbuchstaben - Bindestriche werden zu Unterstrichen

# Port per Umgebungsvariable setzen
export SERVER_PORT=9090
./gradlew bootRun
# -> Startet auf Port 9090

Das ist wichtig für Container und Cloud-Deployments, wo Konfiguration über Umgebungsvariablen erfolgt.

24.7 Prioritäten

Wenn dieselbe Property aus mehreren Quellen kommt, gewinnt die höhere Priorität:

Kommandozeilenargumente schlagen alles:

# Überschreibt ALLES andere
./gradlew bootRun --args='--server.port=9999'

Das ermöglicht flexible Deployments: Defaults im JAR, Anpassungen per Umgebung.