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 följande utseende:

Code Block
languagejson
{
    "type": "https://example.com/probs/out-of-credit",            [1]
    "title": "You do not have enough credit.",                    [2]
    "detail": "Your current balance is 30, but that costs 50.",   [3]
    "instance": "/account/12345/msgs/abc",                        [4]
    "balance": 30,                                                [5]
    "accounts": ["/account/12345", "/account/67890"]              [5]
   }

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);

eller

Code Block
languagejava
throw Problem.valueOf(Status.INTERNAL_SERVER_ERROR, "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 instance")
    .withDetail("Instance 76E4E924-211B-4576-9645-559723812DEB not found")
    .with("instance", "76E4E924-211B-4576-9645-559723812DEB")
    .build();