TODOFö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"
} |