Files
asmhatreandClaude Opus 5 926250e1a9 Add problem-details: global exception handling with RFC 9457
Companion code for "Global Exception Handling with ProblemDetail (RFC 9457)
in Spring Boot 4". Thirteen failures under five handling setups (Boot
defaults, the Boot flag, a ResponseEntityExceptionHandler advice, advice
plus an ErrorController, a catch-all ordered first), validation errors,
i18n, content negotiation, Security's 401/403, silent 500s and decoding
on the client. 16 tests pin the behaviour.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01C3TETMrqVUWeFkNtz3Jbo3
2026-09-11 17:12:22 +00:00

68 lines
2.8 KiB
Plaintext

# Profile: catchall-first (spring-boot 4.1.1, spring-framework 7.0.9)
## domain exception (OrderNotFoundException)
$ curl -X GET /orders/999
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders/999","status":500,"title":"Internal Server Error"}
## type mismatch (/orders/abc)
$ curl -X GET /orders/abc
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders/abc","status":500,"title":"Internal Server Error"}
## invalid body (@Valid)
$ curl -X POST /orders -d '{"sku":"","quantity":0,"customerEmail":"nope"}'
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders","status":500,"title":"Internal Server Error"}
## invalid @RequestParam (@Max)
$ curl -X GET /orders?limit=500
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders","status":500,"title":"Internal Server Error"}
## ErrorResponseException (OutOfStock)
$ curl -X POST /orders -d '{"sku":"SKU-2","quantity":3,"customerEmail":"[email protected]"}'
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders","status":500,"title":"Internal Server Error"}
## ResponseStatusException
$ curl -X GET /orders/legacy/7
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders/legacy/7","status":500,"title":"Internal Server Error"}
## unknown path
$ curl -X GET /no-such-thing
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/no-such-thing","status":500,"title":"Internal Server Error"}
## wrong HTTP method
$ curl -X DELETE /orders/1
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders/1","status":500,"title":"Internal Server Error"}
## malformed JSON
$ curl -X POST /orders -d '{"sku":'
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders","status":500,"title":"Internal Server Error"}
## unexpected exception
$ curl -X GET /orders/boom
HTTP 500 Content-Type: application/problem+json
{"detail":"Something went wrong","instance":"/orders/boom","status":500,"title":"Internal Server Error"}
## exception in a servlet filter
$ curl -X GET /orders/1 [X-Tenant: BAD!]
HTTP 500 Content-Type: application/json
{"timestamp":"2026-09-11T17:03:37.596Z","status":500,"error":"Internal Server Error","path":"/orders/1"}
## 401 no credentials
$ curl -X GET /admin/orders
HTTP 401 Content-Type: application/json
{"timestamp":"2026-09-11T17:03:37.638Z","status":401,"error":"Unauthorized","path":"/admin/orders"}
## 403 wrong role
$ curl -X GET /admin/orders [AUTH:user:user]
HTTP 403 Content-Type: application/json
{"timestamp":"2026-09-11T17:03:37.845Z","status":403,"error":"Forbidden","path":"/admin/orders"}