在多层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项目中抛出自定义异常的主要内容,如果未能解决你的问题,请参考以下文章

spring 或 springboot统一异常处理

从Spring-Security过滤器中抛出用户定义的异常

未抛出 spring webflux 的自定义异常

Spring Boot @ControllerAdvice 部分工作,不适用于自定义异常

Spring:如何让过滤器抛出自定义异常?

在java web开发中抛出如下异常,求大神知道!