3.8 KiB
3.8 KiB
Journal: Behebung von 500er Fehlern im Ping-Service & Security-Fixes
Datum: 19. April 2026 Status: Abgeschlossen Agent: 🏗️ [Lead Architect] | 🧐 [QA Specialist] | 🧹 [Curator]
🎯 Zielsetzung
Nach der gestrigen Umstrukturierung traten beim ping-service HTTP 500 Fehler bei autorisierten API-Aufrufen auf. Ziel war die Identifikation der Ursachen (Security, Parameter-Mapping, Resilience) und deren Behebung sowie die Aktualisierung der Testsuite.
🛠️ Durchgeführte Änderungen
1. Security-Mapping & Rollen-Korrektur
- Im
PingControllerwurden die@PreAuthorize-Annotationen korrigiert. Da derKeycloakRoleConverterdas PräfixROLE_hartkodiert hinzufügt und die Rollen in Großbuchstaben umwandelt, wurden die Prüfungen vonMELD_USERaufROLE_MELD_USER(bzw.ROLE_MELD_ADMIN) angepasst. - Der Import der
AccessDeniedExceptionimPingExceptionHandlerwurde auf die korrekte Spring Security Klasse fixiert, um 403-Fehler sauber zu fangen und nicht in 500er zu verwandeln.
2. API-Konsistenz & Parameter-Mapping
- Der Query-Parameter für
/api/ping/syncwurde explizit auflastSyncTimestampgemappt, um mit dem Postman-Aufruf und den Anforderungen des Frontends konsistent zu sein.
3. Resilience4j & Coroutines
- Die Bibliothek
resilience4j-kotlinwurde in dielibs.versions.tomlaufgenommen und imping-serviceeingebunden. Dies stellt sicher, dass der@CircuitBreakerkorrekt mit KotlinsuspendFunktionen zusammenarbeitet und Exceptions nicht unkontrolliert durchschlagen.
4. Test-Aktualisierung
PingControllerTest.ktwurde angepasst, um den neuen Parameter-NamenlastSyncTimestampzu verwenden.- Alle 5 Tests im
PingControllerTestverlaufen nun erfolgreich.
✅ Verifizierung
./gradlew :backend:services:ping:ping-service:test: ERFOLGREICH (5/5 Tests passed)- Manueller Check der Parameter-Namen gegen Postman-Anforderungen: ERFOLGREICH
- Verifizierung des Rollen-Mappings im
KeycloakRoleConvertergegen Controller-Annotationen: KONSISTENT
🧹 Fazit
Die "letzte Meile" der Service-Kommunikation ist nun stabil. Durch das verbesserte Exception-Handling und die korrekte Resilience-Integration liefert der Service nun aussagekräftige HTTP-Statuscodes statt generischer 500er Fehler.
Nachtrag 20:30
- Networking-Fix:
GlobalSecurityConfigangepasst, umjwk-set-uriprimär aus Spring-Properties oder Environment-Variables zu lesen. Default auflocalhost:8180für IDE-Betrieb korrigiert, umUnknownHostException: keycloakzu vermeiden. - Exception-Handling:
PingExceptionHandlerum generischenException-Handler erweitert, um auch Security-Initialisierungsfehler (wie JWT-Decoder-Probleme) sauber abzufangen und zu loggen.
Nachtrag 21:25
- Re-Fix Circuit Breaker Fallback: Nachdem ein fehlerhafter Zwischenversuch (möglicherweise durch einen anderen Agenten) die
suspend-Markierung wieder eingeführt hatte, wurde diese nun final entfernt. Die SignaturfallbackPing(simulate: Boolean, ex: Throwable)ohnesuspendist die einzig stabile Variante für Resilience4j in Kombination mit Spring Boot 3 AOP-Proxies und Kotlin Coroutines. Tests bestätigen die strukturelle Korrektheit.
Nachtrag 21:45
- Stochastic Simulation: Die Zufallskomponente (
Random.nextDouble() < 0.6) wurde in derenhancedPing-Methode wieder eingeführt. - Logik: Wenn
simulate=trueübergeben wird, tritt der Fehler nun nur noch in ca. 60% der Fälle auf, was ein realistisches "intermittierendes" Fehlerszenario für den Circuit Breaker Test darstellt. In den restlichen 40% wird die Anfrage trotz Simulationsmodus erfolgreich verarbeitet. - Logging: Zusätzliches Log-Statement für den "Lucky Pass" Fall hinzugefügt, um die Simulationstransparenz in der Konsole zu wahren.