TODO
...
Problem + Problem Spring Web
...
Vilka fel hanteras, och med vilka statusar?
...
För felhantering använder ramverket Problem och specialiseringen Problem Spring Web MVC från Zalando, som är ett bibliotek som implementerar application/problem.json
(RFC 7807 - Problem Details for HTTP APIs).
Felmeddelanden i tjänster som använder ramverket kommer att ha ett utseende liknande:
Code Block | ||
---|---|---|
| ||
{
"type": "https://example.com/probs/out-of-credit", [1]
"status": 400, [2]
"title": "You do not have enough credit.", [3]
"detail": "Your current balance is 30, but that costs 50.", [4]
"instance": "/account/12345/msgs/abc", [5]
"balance": 30, [5]
"accounts": ["/account/12345", "/account/67890"] [5]
} |
[1]
Fel-typ (ej obligatorisk)[2]
HTTP-status[3]
Titel - en kort summering av felet[4]
Beskrivning - en längre beskrivning av felet (ej obligatorisk)[5]
Valfria fält - kan innehålla i princip vad som helst (ej obligatoriska)
Felhantering “out-of-the-box”
Följande felhantering är konfigurerad som standard:
Fel | HTTP-status | |
---|---|---|
Generellt | ||
| (beror på) | |
|
| |
|
| |
HTTP | ||
|
| |
|
| |
|
| |
I/O | ||
|
| |
|
| |
|
| |
Nätverk | ||
|
| |
Routing | ||
|
| |
|
| |
|
| |
|
| |
Validering | ||
|
| |
|
|
Egna fel
I vissa lägen räcker HTTP-status för att förmedla tillräcklig information om ett fel. Då kan följande räcka för att kasta ett fel:
Code Block | ||
---|---|---|
| ||
throw Problem.valueOf(Status.NOT_FOUND); |
vilket skulle generera svaret:
Code Block | ||
---|---|---|
| ||
{
"title": "Not Found",
"status": 404
} |
Om lite ytterligare information önskas:
Code Block | ||
---|---|---|
| ||
throw Problem.valueOf(Status.INTERNAL_SERVER_ERROR, "Database seems to be down") |
med tillhörande svar:
Code Block | ||
---|---|---|
| ||
{
"title": "Internal Server Error",
"status": 500,
"detail": "Database seems to be down"
} |
I andra fall behövs mer information, och då tillhandahåller Problem-biblioteket en builder:
Code Block |
---|
throw Problem.builder()
.withStatus(Status.NOT_FOUND)
.withTitle("No such item")
.withDetail("Item 76E4E924-211B-4576-9645-559723812DEB not found")
.with("item", "76E4E924-211B-4576-9645-559723812DEB")
.build(); |
vilket då skulle ge svaret:
Code Block | ||
---|---|---|
| ||
{
"status": 404,
"title": "No such item",
"detail": "Item 76E4E924-211B-4576-9645-559723812DEB not found",
"item": "76E4E924-211B-4576-9645-559723812DEB"
} |