Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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
languagejson
{
    "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

Problem

(beror på)

Throwable (generellt)

500 Internal Server Error

UnsupportedOperationException

501 Not Implemented

HTTP

HttpRequestMethodNotSupportedException

405 Method Not Allowed

HttpMediaTypeNotAcceptableException

406 Not Acceptable

HttpMediaTypeNotSupportedException

415 Unsupported Media Type

I/O

HttpMessageNotReadableException

400 Bad Request

MultipartException

400 Bad Request

TypeMismatchException

400 Bad Request

Nätverk

SocketTimeoutException

504 Gateway Timeout

Routing

MissingServletRequestParameterException

400 Bad Request

MissingServletRequestPartException

400 Bad Request

NoHandlerFoundException

404 Not Found

ServletRequestBindingException

400 Bad Request

Validering

ConstraintViolationException

400 Bad Request

MethodArgumentNotValidException

400 Bad Request

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
languagejava
throw Problem.valueOf(Status.NOT_FOUND);

vilket skulle generera svaret:

Code Block
languagejson
{
  "title": "Not Found",
  "status": 404
}


Om lite ytterligare information önskas:

Code Block
languagejava
throw Problem.valueOf(Status.INTERNAL_SERVER_ERROR, "Database seems to be down")

med tillhörande svar:

Code Block
languagejson
{
  "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
languagejson
{
  "status": 404,
  "title": "No  such item",
  "detail": "Item 76E4E924-211B-4576-9645-559723812DEB not found",
  "item": "76E4E924-211B-4576-9645-559723812DEB"
}