Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| de:modul:ffit:3-jahr:java:learningunits:lu10:a [2025/11/09 23:16] – apeter | de:modul:ffit:3-jahr:java:learningunits:lu10:a [2025/11/10 00:02] (aktuell) – apeter | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== LU10a - Umgang mit Exceptions ====== | ====== LU10a - Umgang mit Exceptions ====== | ||
| + | |||
| + | ==== Spring ResponseStatusException ==== | ||
| + | |||
| + | Allgemein gilt, dass Exceptions in Bezug auf die Performanz schlechter abschneiden als die entsprechenden Checks. Daher sollte man Exceptions nie in " | ||
| + | |||
| + | Spring bietet eine sehr einfache Version, um Fehlerfälle mittels Exceptions abzuhandeln. Dabei wird direkt automatisch eine Antwort mit dem entsprechenden HTTP-Statuscode erstellt und zurückgeschickt. | ||
| + | |||
| + | Im nachfolgenden Beispiel wird jeweils ein Project-Objekt geladen und falls kein Objekt in der Datenbank vorhanden ist, wird der Statuscode 404 zurückgegeben. | ||
| + | |||
| + | ^ Lange Variante ^ Verkürzte Variante ^ Variante mit Exception ^ | ||
| + | | < | ||
| + | <code java> | ||
| + | Optional< | ||
| + | if(optionalProject.isEmpty()){ | ||
| + | return ResponseEntity.notFound().build(); | ||
| + | } | ||
| + | Project project = optionalProject.get(); | ||
| + | </ | ||
| + | </ | ||
| + | <code java> | ||
| + | Project project = projectRepository.findById(projectName).orElse(null); | ||
| + | if(null == project){ | ||
| + | return ResponseEntity.notFound().build(); | ||
| + | } | ||
| + | </ | ||
| + | </ | ||
| + | <code java> | ||
| + | Project project = projectRepository.findById(projectName).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Ein sehr grosser Vorteil der dritten Variante ist die Wiederverwendbarkeit: | ||
| ==== Validierung des JWT ==== | ==== Validierung des JWT ==== | ||
| Zeile 22: | Zeile 54: | ||
| </ | </ | ||
| - | + | Wenn nun zudem Informationen wie das " | |
| - | + | ||
| - | Hierbei ist anzumerken, dass Exceptions in aller Regel in Bezug auf die Performanz schlechter abschneiden als die entsprechenden Checks. Daher sollte man Exceptions nie in "Schönwetter"-Fällen benutzen, sondern höchstens in unerwarteten Situationen. Ein invalides Token, bzw. allgemein ein ungültiger API-Aufruf, ist in unserem Fall unerwartet | + | |
| - | + | ||
| - | Wenn zudem | + | |
| - | + | ||
| <code java> | <code java> | ||
| - | import org.slf4j.Logger; | + | public String verifyTokenAndExtractSubject() { |
| - | import org.slf4j.LoggerFactory; | + | try{ |
| + | String token = extractTokenFromHeader(); | ||
| + | | ||
| + | } catch (Exception e) { | ||
| + | // Exception mitschicken | ||
| + | // throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, | ||
| - | public class DemoController { | + | // Exception loggen |
| - | | + | log.warn(" |
| - | ... | + | |
| - | | + | } |
| - | </ | + | } |
| - | Neu ist, dass wir die dazugehörigen Einstellungen einfach in unser '' | + | private String extractSubject(String token) { |
| + | return Jwts.parserBuilder() | ||
| + | | ||
| + | .build() | ||
| + | .parseClaimsJws(token) | ||
| + | .getBody() | ||
| + | .getSubject(); | ||
| + | } | ||
| - | <code application.properties> | + | private String extractTokenFromHeader() { |
| - | logging.level.root=INFO | + | |
| - | logging.level.ch.bzz=DEBUG | + | if (attributes |
| - | logging.file.name=app.log | + | |
| - | </ | + | } |
| - | + | | |
| - | + | if (authHeader == null || !authHeader.startsWith(" | |
| - | Project Lombok hilft uns auch hier die Erstellung des Logger-Objektes zu vereinfachen. | + | |
| - | + | } | |
| - | <code java> | + | |
| - | import lombok.extern.slf4j.Slf4j; | + | } |
| - | + | ||
| - | @Slf4j | + | |
| - | public class DemoController { | + | |
| - | ... | + | |
| - | log.error("Error during execution of...:", | + | |
| </ | </ | ||