ResponseEntityExceptionHandler is not called when an exception occurs

I am new to spring. I am developing a REST api with spring webmvc. For error handling, I got this link http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-rest-spring-mvc-exceptions

I am trying to use a ResponseEntityExceptionHandler in my project. but whenever my controller throws an exception, it never gets to that ResponseEntityExceptionHandler.

Below is a snippet of code

controller

@Controller @RequestMapping("/hello") public class HelloController { private static final Logger logger = Logger.getLogger(HelloController.class); @RequestMapping(value="/{name}", method=RequestMethod.GET) public @ResponseBody String greet(@PathVariable(value = "name")String name ) throws InvalidInputException, ResourceNotFoundException{ logger.info("start greet() "+name ); System.out.println("start greet() "+name); String message = null; if("".equalsIgnoreCase(name)) { throw new InvalidInputException("Invalid Input"); } List<String> names = new ArrayList<String>(); names.add("Harshal"); names.add("Smitesh"); if(names.contains(name)){ message = "Hello "+ name; }else{ throw new ResourceNotFoundException("Requested Resource not found"); } System.out.println("end greet"); logger.info("end greet()"); return message; } } 

Exceptions

 package com.practice.errorhandlerdemo.exception; public class InvalidInputException extends RuntimeException{ private static final long serialVersionUID = 5489516240608806490L; public InvalidInputException() { super("Invalid Input"); } public InvalidInputException(String message) { super(message); } } package com.practice.errorhandlerdemo.exception; public class ResourceNotFoundException extends RuntimeException { private static final long serialVersionUID = -4041009155673754859L; public ResourceNotFoundException() { super("requested resource not found"); } public ResourceNotFoundException(String message) { super(message); } } 

ExceptionHandler

 @ControllerAdvice public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler { private static final Logger logger = Logger.getLogger(RestResponseEntityExceptionHandler.class); @ExceptionHandler(value={ResourceNotFoundException.class}) @ResponseStatus(value=HttpStatus.NOT_FOUND) protected ResponseEntity<Object> handleResourceNotFound(RuntimeException ex, WebRequest request){ logger.info("start handleResourceNotFound()"); String bodyOfResponse = "Requested resource does not found"; HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); return handleExceptionInternal(ex, bodyOfResponse, httpHeaders, HttpStatus.NOT_FOUND, request); } @ExceptionHandler(value={InvalidInputException.class}) @ResponseStatus(value=HttpStatus.BAD_REQUEST) protected ResponseEntity<Object> handleInvalidInput(RuntimeException ex, WebRequest request){ logger.info("start handleInvalidInput()"); String bodyOfResponse = "Invalid Input"; HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON); return handleExceptionInternal(ex, bodyOfResponse, httpHeaders, HttpStatus.BAD_REQUEST, request); } } 

dispatch servlet

 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <context:component-scan base-package="com.practice.errorhandlerdemo.controller"/> <context:annotation-config/> </beans> 

web.xml

 <web-app> <display-name>ErrorHandlerDemo</display-name> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/my-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> 
+8
spring-mvc spring-security error-handling spring-3
source share
3 answers

You do not need to extend the ResponseEntityExceptionHandler unless you need all the exception mappings it provides.

A simpler way to write exception handling is:

 @ControllerAdvice public class RestResponseEntityExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) protected ResponseEntity<String> handleResourceNotFound(ResourceNotFoundException ex){ return ResponseEntity .status(HttpStatus.NOT_FOUND) .body("Requested resource does not found"); } @ExceptionHandler(InvalidInputException.class) protected ResponseEntity<String> handleInvalidInput(InvalidInputException ex){ return ResponseEntity .badRequest() .body("Invalid Input"); } } 

Note that the ResponseEntity builder API was introduced in Spring 4.1, but you can use the regular constructor on 4.0.x.

+3
source share

I have the same problem in Spring WebMVC 4.2.5. The reason was the throwExceptionIfNoHandlerFound the DispatcherServlet parameter. By default, this value is false , so all errors generate a response < HttpServletResponse.SC_NOT_FOUND servo and exception exceptions.

After I set it to true, my @ExceptionHandlers started working

+1
source share

There are several reports of situations where ResponseEntityExceptionHandler and @ControllerAdvice have not been executed.

Both of them should compile methods that were canceled by @ExceptionHandler under the class to a normal place from which all controllers can refer.

If this does not work for you. You can add @ExceptionHandler methods to the general AbstractController class, which is extended by all other controllers.

0
source share

All Articles