Spring MVC处理异常

时间:2015-08-19 18:33:53

标签: spring hibernate spring-mvc

我使用 controller-> service-> dao 架构构建了一个spring mvc应用程序。 DAO对象正在使用休眠。这些服务带有注释@Transactional

我正在尝试捕获服务中的dao异常,将它们包装起来,然后将它们抛给我的控制器:

服务

@Override
public Entity createEntity(Entity ent) throws ServiceException {
    try {
        return entityDAO.createEntity(ent);
    } catch (DataAccessException dae) {
        LOG.error("Unable to create entity", dae);
        throw new ServiceException("We were unable to create the entity for the moment. Please try again later.", dae);
    }
}

控制器

@RequestMapping(value = "/create", method = RequestMethod.POST)
public String createEntity(@ModelAttribute(value = "newEntity") Entity newEntity, RedirectAttributes redirectAttributes) {
        try {
            entityService.createEntity(newEntity);
        } catch (ServiceException se) {
            redirectAttributes.addFlashAttribute("error", se.getMessage());
        }
    }
    return "redirect:/entity/manage";
}

但是,即使DataAccessException是在服务级别捕获的,它仍会以某种方式冒泡到我的控制器。

例如,如果我在数据库级别上没有满足唯一字段条件,则会收到HTTP错误500,其中包含以下内容:

org.hibernate.AssertionFailure: null id in com.garmin.pto.domain.Entity entry (don't flush the Session after an exception occurs)

4 个答案:

答案 0 :(得分:0)

代码缓存DataAccessException而不是HibernateException,尝试缓存HibernateException

Is there a way to translate HibernateException to something else, then DataAccessException in sping

答案 1 :(得分:0)

如果您想在Controller中处理异常,请不要在服务中捕获它。

服务

@Override
public Entity createEntity(Entity ent) throws DataAccessException {
    return entityDAO.createEntity(ent);
}

控制器

@RequestMapping(value = "/create", method = RequestMethod.POST)
public String createEntity(@ModelAttribute(value = "newEntity") Entity newEntity, RedirectAttributes redirectAttributes) {
    try {
        entityService.createEntity(newEntity);
    } catch (DataAccessException e) {
        redirectAttributes.addFlashAttribute("error", e.getMessage());
    }
    return "redirect:/entity/manage";
}

或者,如果您想利用Spring处理异常,请使用ExceptionHandler注释。您可以在线找到好的教程,例如Spring MVC @ExceptionHandler Example

答案 2 :(得分:0)

使异常翻译工作

  1. 您必须使用@Repository
  2. 注释您的DAO
  3. 确保您已声明此bean <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

答案 3 :(得分:0)

Here是关于处理Spring MVC项目异常的不同方法的精彩帖子。

其中,我发现使用@ControllerAdvice类来处理全局一个地方的所有异常,一般来说最方便。 Spring Lemon的源代码可以作为一个很好的具体示例。