我正在构建一个包含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");
}
答案 0 :(得分:1)
除非需要,否则您应该只在服务层中处理异常,作为设计的一部分。考虑一下您对其他映射需要相同功能deleteMenu
的要求。
从任何设计角度来看。保持控制器非常特定于处理仅为请求映射到业务逻辑的模型属性。保留服务层中的方法以获取menuGroupId
并在抛出参数或发生DB错误时从该服务抛出异常。