无法使用Spring MVC在服务层中包装DAO异常

时间:2015-02-03 09:41:25

标签: java spring-mvc exception exception-handling custom-exceptions

我正在尝试使用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;
}}

2 个答案:

答案 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 异常