I am trying to handle custom exception handling using Spring MVC. DAO layer exception handler by service layer and service layer wrap that exception and handle that exception by Controller exception handler by Spring MVC. Following is my code:
@Override
public void saveNewMachineDetails(Machine machine, Configurations configurations) throws DataNotPersist{
logger.info("call service saveNewMachineDetails method");
try{
machineRepository.saveAndFlush(machine);
}catch(Exception ex){
// logger.error(ex.getMessage());
DataNotPersist dataNotPersist = new DataNotPersist(messageSource.getMessage("code.object.notpersist", null, null),
messageSource.getMessage("msg.object.notpersist", new Object[]{"Machine"}, null), ex);
throw dataNotPersist;
}}
In the above code the DAO layer exception handle at service layer and wrap that exception in custom exception and throw that exception.
In web layer i have configure Exception handler for handling exception, but when the exception is throw, the handler not catch the exception, i think because of i am unable to wrap actual exception with custom exception. Following is my exception handler code:
@ControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
@ExceptionHandler(value = DataNotPersist.class)
public ModelAndView defaultExceptionHandler(HttpServletRequest request, DataNotPersist ex)throws Exception {
logger.info("In GlobalExceptionHandler");
logger.debug("********* : "+ex.getMessage());
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("exception", ex);
modelAndView.addObject("url", request.getRequestURL());
modelAndView.setViewName("common/error");
return modelAndView;
}}
In service layer when i throw the exception, spring roll back the transaction and wrap my
Exception
intoTransactionException
at view. Now i handle the transaction rollback with myException
class as below:The ControllerAdvice will not catch the exceptions that happen in the service layers. From the docs
So in order for the ControllerAdvice method to take effect, your controller method must throw the DataNotPersist exception