在多层spring项目中抛出自定义异常
Posted
技术标签:
【中文标题】在多层spring项目中抛出自定义异常【英文标题】:Throwing custom exceptions in multi-layered spring project 【发布时间】:2021-11-22 17:46:39 【问题描述】:我正在尝试处理存在违反唯一字段(例如,用户名/邮件)的用例,这样处理是否正确? (我在dao层使用jdbcInsert)
@Transactional
@Override
public User register(String name, String surname, String username, String email, String password)
User user = null;
try
user = userDao.register(name, surname, username,
email, passwordEncoder.encode(password));
catch (DuplicateKeyException duplicateKeyException)
throw new DuplicateUserException(duplicateKeyException.getMessage());
catch (DataAccessException dataAccessException)
throw new SystemUnavailableException(dataAccessException.getMessage());
return user;
并在控制器中捕获我的自定义异常:
@ControllerAdvice
public class ErrorControllerAdvice
@ExceptionHandler(DuplicateUserException.class)
public ModelAndView keyViolation(DuplicateUserException ex)
ModelAndView mav = new ModelAndView("admin/user/new");
mav.addObject("duplicateMessage", ex.getErrorMessage());
return mav;
@ExceptionHandler(SystemUnavailableException.class)
@ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
public ModelAndView unexpectedDatabaseError(SystemUnavailableException ex)
LOGGER.error(ex.getErrorMessage());
return new ModelAndView("500");
【问题讨论】:
【参考方案1】:我觉得不错。您的自定义异常存在于不同的抽象级别,这为它们提供了存在的充分理由。
您可以考虑在控制器中处理异常,而不是使用错误转换器类 (ErrorControllerAdvice
)。这使事情变得更加明确,并限制了有关如何处理异常的意外情况。
【讨论】:
以上是关于在多层spring项目中抛出自定义异常的主要内容,如果未能解决你的问题,请参考以下文章