我正在尝试使用Spring MVC处理自定义异常处理。服务层和服务层的DAO层异常处理程序包装该异常并由Spring MVC通过Controller异常处理程序处理该异常。以下是我的代码:
@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;
}}
在上面的代码中,服务层的DAO层异常句柄将该异常包装在自定义异常中并抛出该异常。
在web层我已经配置了Exception处理程序来处理异常,但是当抛出异常时,处理程序没有捕获异常,我认为因为我无法用自定义异常包装实际异常。以下是我的异常处理程序代码:
@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;
}}
答案 0 :(得分:1)
在我抛出异常的服务层中,Spring回滚事务并将Exception
包装到TransactionException
视图中。现在我用我的Exception
类处理事务回滚,如下所示:
@Override
@Transactional(value="transaction_manager", rollbackFor={DataNotPersist.class})
public void saveNewMachineDetails(Machine machine, Configurations configurations) throws DataNotPersist{
logger.info("call service saveNewMachineDetails method");
try{
machineRepository.saveAndFlush(machine);
}catch(DataAccessException 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;
}}
答案 1 :(得分:0)
ControllerAdvice 不会捕获服务层中发生的异常。来自文档
它通常用于定义适用于所有 @RequestMapping 方法的 ExceptionHandler 方法。
因此,为了使 ControllerAdvice 方法生效,您的控制器方法必须抛出 DataNotPersist 异常