具有3层体系结构的Spring MVC中的异常处理

时间:2014-06-07 09:19:31

标签: java spring spring-mvc

我正在构建一个包含3层的简单Web应用程序 - DAO,Service,MVC。在我的控制器中,我想删除菜单组,它包含菜单,我得到ConstraintViolationException。

我应该在哪里处理此例外?在DAO,服务或控制器中?目前我在Controller中处理异常。

我的代码如下。

用于删除菜单组的DAO方法:

@Override
public void delete(E e){
    if (e == null){
        throw new DaoException("Entity can't be null.");
    }

    getCurrentSession().delete(e);
}

删除菜单组的服务方法:

@Override
@Transactional(readOnly = false)
public void delete(MenuGroupEntity menuGroupEntity) {
    menuGroupDao.delete(menuGroupEntity);
}

在Controller中删除菜单组的控制器方法:

@RequestMapping(value = "/{menuGroupId}/delete", method = RequestMethod.GET)
public ModelAndView delete(@PathVariable Long menuGroupId, RedirectAttributes redirectAttributes){
    MenuGroupEntity menuGroupEntity = menuGroupService.find(menuGroupId);

    if (menuGroupEntity != null){
        try {
            menuGroupService.delete(menuGroupEntity);
            redirectAttributes.addFlashAttribute("flashMessage", "admin.menu-group-deleted");
            redirectAttributes.addFlashAttribute("flashMessageType", "success");
        } catch (Exception e){
            redirectAttributes.addFlashAttribute("flashMessage", "admin.menu-group-could-not-be-deleted");
            redirectAttributes.addFlashAttribute("flashMessageType", "danger");
        }
    }

    return new ModelAndView("redirect:/admin/menu-group");
}

1 个答案:

答案 0 :(得分:1)

除非需要,否则您应该只在服务层中处理异常,作为设计的一部分。考虑一下您对其他映射需要相同功能deleteMenu的要求。

从任何设计角度来看。保持控制器非常特定于处理仅为请求映射到业务逻辑的模型属性。保留服务层中的方法以获取menuGroupId并在抛出参数或发生DB错误时从该服务抛出异常。

参考更多:Model-View-Controller, what every part really does?