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

  1. 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.
  2. Make that method return a ProblemDetail object
  3. Throw your desired exception from within the application. Note that most common exceptions are already handled in RestExceptionHandlerControllerAdvice and LimitsProcessExceptionHandler.

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: