Adding Custom UI Exceptions
Atoti Limits 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
- Add a method annotated with
@ExceptionHandler
in a class annotated with@RestControllerAdvice
or@ControllerAdvice
. 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. Note that most common exceptions are already handled in
RestExceptionHandlerControllerAdvice
andLimitsProcessExceptionHandler
.
How it works
For an example of how we do this on the server side in Atoti Limits see RestExceptionHandlerControllerAdvice
, which looks as follows:
@RestControllerAdvice
public class RestExceptionHandlerControllerAdvice {
@ExceptionHandler({ LimitsServiceException.class })
ProblemDetail handleRestServiceException(LimitsServiceException 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 service exception LimitsServiceException
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, displayed by the UI.stacktrace
: a string that contains the stack trace of the exception, not displayed by the UI but may be useful for debugging.
note
The @ExceptionHandler
annotation accepts multiple classes of exception for a single method.
For more server-side information, see the Spring Framework Documentation: