Customizing UI exceptions
Atoti Sign-Off allows you to display custom error messages in the UI.
To do this, return a response type in the structure of a ProblemDetail object.
Steps
- Create a class annotated with
@RestControllerAdvice
or@ControllerAdvice
and import it into your main Spring configuration class. - Add a method in this class annotated with
@ExceptionHandler
. The@ExceptionHandler
annotation should contain the classes of exceptions you’d like to handle. - Make that method return a
ProblemDetail
object. - Throw your desired exception from within the application. A
ProblemDetail
response should be returned which our UI will parse.
How it works
An example of how you can do this might look as follows:
@RestControllerAdvice
public class RestExceptionHandlerControllerAdvice {
@ExceptionHandler({ MyCustomException.class })
ProblemDetail handleRestServiceException(MyCustomException ex) {
ProblemDetail problemDetail = ProblemDetail.forStatusAndDetail(ex.getHttpStatus(), ex.getMessage());
problemDetail.setProperty("action", ex.getAction());
problemDetail.setProperty("stacktrace", ExceptionUtils.getStackTrace(ex));
return problemDetail;
}
}
This simple class is annotated with @RestControllerAdvice
, meaning it will catch exceptions thrown from REST methods. In reality, it inherits from the global
exception handler @ControllerAdvice
, which handles exceptions thrown from any method.
The single method in RestExceptionHandlerControllerAdvice
catches the generic exception MyCustomException
using the @ExceptionHandler
annotation and returns a ProblemDetail
object, which our UI will parse appropriately.
The ProblemDetail
object accepts a map of variables that may hold custom fields of interest. For example, we supply the following fields:
action
: a string you can use to suggest a course of action to the user, which is displayed by the UI.stacktrace
: a string that contains the stack trace of the exception. This is not displayed by the UI but can be useful for debugging via the network tab in your browser’s developer tools.
note
The @ExceptionHandler
annotation accepts multiple exception classes for a single method and will catch any exceptions that inherit from the specified exception.
For more server-side information, see the Spring Framework Documentation: