The Question
When creating a controller in Spring Boot to handle all errors/exceptions in a custom way, including custom exceptions, which technique should be preferred?
Should the controller implement the Spring Boot's
ErrorController
?Should the controller extend Spring's
ResponseEntityExceptionHandler
?Both: a single controller implementing and extending both classes including both of their functionality?
Both: two separate controllers, one implementing
ErrorController
, the other extendingResponseEntityExceptionHandler
?
The Goal
The reason for this post is to find a way of exception-handling in Spring Boot with all of the following attributes:
- All
Throwable
s occurring in controllers/filters/interceptors during the handling of a request should be caught. - In the case of catching a
Throwable
, we do not want to expose any of the stack trace or other implementation details to the client ever (unless explicitly coded that way). - It should be possible to handle all occurred
Throwable
s separately by their class. For any other non-specified type, a default response can be specified. (I know for sure, that this is possible with@ExceptionHandler
. ButErrorController
?) - The code should be as clean and explicit as possible with no ugly work-arounds or UB to achieve this goal.
More Details
I noticed that both the controllers (see 1 and 2 above) may contain methods returning a ResponseEntity
object, thus handling the occurred exception and returning a response to the client. So they could in theory produce the same result?
There are several tutorials out there on the use of techniques 1 and 2. But I have found no articles considering both options, comparing them or using them together, which raises several additional questions:
Should they even be considered together?
What are the main differences between these two proposed techniques? What are the similarities?
Is one a more powerful version of the other? Is there something one can do that the other can't and vice versa?
Can they be used together? Are there situations where this would be necessary?
If they are used together, how would an exception be handled? Does it go through both handlers or just one? In the case of the latter, which one?
If they are used together, and an exception is thrown inside the controller (one or the other) during exception handling, how would that exception be handled? Is it sent to the other controller? Could exceptions theoretically start bouncing between controllers or create some other kind of non-recovering loop?
Is there any trusted/official documentation on how Spring Boot uses Spring's
ResponseEntityExceptionHandler
internally or how it expects it to be used in Spring Boot applications?If
ResponseEntityExceptionHandler
alone is already enough, then why doesErrorController
exist?
When looking at the Spring's ResponseEntityExceptionHandler
together with the @ExceptionHandler
annotation, it seems to be more powerful in handling different types of exceptions separately and using cleaner code. But because Spring Boot is built on top of Spring, does this mean:
- When using Spring Boot, we should implement
ErrorController
instead of extendingResponseEntityExceptionHandler
? - Can
ErrorController
do everythingResponseEntityExceptionHandler
can, including handling different types of exceptions separately?
EDIT: Related: Spring @ControllerAdvice vs ErrorController