Mastering Exception Handling in Spring Boot using @ControllerAdvice and @ExceptionHandler

Nikhil Sukhani
3 min readDec 29, 2022

--

Spring Boot Exception Handling

Exceptions are an inevitable part of software development, and knowing how to handle them is an essential skill for any developer. In this blog, we’ll look at how to handle exceptions in Spring Boot using the @ControllerAdvice and @ExceptionHandler annotations.

1. What are the @ControllerAdvice and @ExceptionHandler annotations?

The @ControllerAdvice and @ExceptionHandler annotations are powerful tools for handling exceptions in Spring Boot. They allow you to specify a method that will be called whenever a specific exception is thrown in your application.

The @ControllerAdvice annotation is used to define a class that will be called whenever an exception is thrown in your application. This class can contain multiple methods, each of which is annotated with the @ExceptionHandler annotation and is responsible for handling a specific exception.

Here’s an example of how to use the @ControllerAdvice and @ExceptionHandler annotations:

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(value = MyCustomException.class)
public ResponseEntity<ErrorResponse> handleMyCustomException(MyCustomException ex) {
ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}

}

In this example, the GlobalExceptionHandler class is annotated with @ControllerAdvice, which means it will be called whenever an exception is thrown in the application. It contains a single method, handleMyCustomException, which is annotated with @ExceptionHandler and is responsible for handling the MyCustomException exception. The method returns a ResponseEntity object, which is a special object that represents an HTTP response, including the status code and the body of the response.

2. How to customize the response to the user

The ResponseEntity object that is returned from the exception handling method can be customized to provide a specific response to the user. For example, you can specify the HTTP status code and the body of the response.

Here’s an example of how to customize the response to the user:

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(value = MyCustomException.class)
public ResponseEntity<ErrorResponse> handleMyCustomException(MyCustomException ex) {
ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}

}

In this example, the handleMyCustomException method returns a ResponseEntity object with a status code of BAD_REQUEST, which indicates that the request was invalid. It also includes a custom ErrorResponse object in the body of the response, which can contain additional information about the error.

3. How to handle multiple exceptions

You can use the @ExceptionHandler annotation to handle multiple exceptions in the same class. Simply define a separate method for each exception you want to handle, and annotate each method with the @ExceptionHandler annotation and the type of exception it should handle.

Here’s an example of how to handle multiple exceptions in the same class:

@ControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(value = MyCustomException.class)
public ResponseEntity<ErrorResponse> handleMyCustomException(MyCustomException ex) {
ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}

@ExceptionHandler(value = AnotherCustomException.class)
public ResponseEntity<ErrorResponse> handleAnotherCustomException(AnotherCustomException ex) {
ErrorResponse errorResponse = new ErrorResponse(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}

}

In this example, the GlobalExceptionHandler class contains two methods: handleMyCustomException and handleAnotherCustomException. Each method is annotated with the @ExceptionHandler annotation and is responsible for handling a specific exception. The handleMyCustomException method handles the MyCustomException exception and returns a ResponseEntity object with a status code of BAD_REQUEST, while the handleAnotherCustomException method handles the AnotherCustomException exception and returns a ResponseEntity object with a status code of INTERNAL_SERVER_ERROR.

I hope this article helped you! Let me know if you have any other questions.

--

--