package org.synyx.urlaubsverwaltung.web; import org.apache.log4j.Logger; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.ModelAndView; import org.synyx.urlaubsverwaltung.web.sicknote.SickNoteAlreadyInactiveException; /** * Handles exceptions and redirects to error page. * * @author Aljona Murygina - murygina@synyx.de */ @ControllerAdvice(basePackages = "org.synyx.urlaubsverwaltung.web") public class ExceptionHandlerControllerAdvice { private static final Logger LOG = Logger.getLogger(ExceptionHandlerControllerAdvice.class); private static final String ERROR_PAGE_NAME = "errors"; /** * Get the common error page. * * @param exception has information about cause of error * * @return the error page as {@link ModelAndView} */ private static ModelAndView getErrorPage(Exception exception, HttpStatus httpStatus) { ModelAndView modelAndView = new ModelAndView(ERROR_PAGE_NAME); modelAndView.addObject("exception", exception); modelAndView.addObject("statusCode", httpStatus.value()); return modelAndView; } @ResponseStatus(HttpStatus.BAD_REQUEST) @ExceptionHandler( { AbstractNoResultFoundException.class, SickNoteAlreadyInactiveException.class, NumberFormatException.class } ) public ModelAndView handleException(AbstractNoResultFoundException exception) { LOG.debug("An exception was thrown: " + exception.getClass().getName()); LOG.debug("An error occurred: " + exception.getMessage()); return ExceptionHandlerControllerAdvice.getErrorPage(exception, HttpStatus.BAD_REQUEST); } @ResponseStatus(HttpStatus.FORBIDDEN) @ExceptionHandler(AccessDeniedException.class) public ModelAndView handleException(AccessDeniedException exception) { LOG.debug("An exception was thrown: " + exception.getClass().getName()); LOG.debug("An error occurred: " + exception.getMessage()); return ExceptionHandlerControllerAdvice.getErrorPage(exception, HttpStatus.FORBIDDEN); } @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ExceptionHandler(Exception.class) public ModelAndView handleException(Exception exception) { LOG.info("An exception was thrown: " + exception.getClass().getName()); LOG.info("An error occurred: " + exception.getMessage()); return ExceptionHandlerControllerAdvice.getErrorPage(exception, HttpStatus.INTERNAL_SERVER_ERROR); } }