Let’s say you created a REST API which accepts a JSON input.
You handle any type of exception in your code and throw a custom error message to the user.
But what if the user sends a bad JSON ?
Spring framework will throw a predefined error message.
Below is the error message I got for supplying invalid JSON to a sample REST API I created:

In some cases different error messages could be returned .
Here is the REST API:
package com.badrequest.custommessage; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.HashMap; import java.util.Map; @org.springframework.web.bind.annotation.RestController public class RestController { @PostMapping("/poke") public Map<String,Object> poke(@RequestBody Map<String,Object> request){ Map<String,Object> response = new HashMap<String,Object>(); try{ response.put("request",request); response.put("status","success"); }catch(Exception e){ response.put("status","Your request is invalid"); } return response; } }
As you see I am just receiving the input and storing it another map along with the status and returning it back.
For any exception I am throwing a custom error message “Your request is invalid”.
What if I want to throw the same error message on a bad request.
It can’t be handled directly in the code as every exception is already caught using a try catch block inside the controller class.
This can be achieved by creating a Controller Advice.
Here is the controller advice class I created:
package com.badrequest.custommessage; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import java.util.HashMap; import java.util.Map; @ControllerAdvice public class ExceptionHandler { @org.springframework.web.bind.annotation.ExceptionHandler @ResponseStatus(HttpStatus.BAD_REQUEST) @ResponseBody Map<String,String> showCustomMessage(Exception e){ Map<String,String> response = new HashMap<>(); response.put("status","Your input is invalid"); return response; } }
To throw a custom error message follow the below algorithm:
STEP1: Create a controller advice class
STEP2: Annotate it with @ControllerAdvice
STEP3: Create a method and return the custom error message in a map inside the method
STEP4: Annotate the method with @ExceptionHandler as this method handles exceptions
STEP5: Annotate the same method with @ResponseStatus(HttpStatus.BAD_REQUEST) as it deals with only 400 BAD REQUEST exceptions
STEP6: Annotate the same method with @ResponseBody to indicate that the response body to be returned for bad requests is supplied by this method.
After implementing it , when I hit the REST API it threw the custom error defined:

That’s it!