SpringBoot中数据实体的异常类:全局异常类还是每个实体一个单独的异常类?

问题描述

迁移旧数据库,我为数据库中的每个重要表创建了一个实体类,然后为它们中的每个创建了一个附加的存储库类。最好为每个实体创建一个异常类,还是为所有实体或它们创建一个全局的异常类?

解决方法

您需要处理哪种异常?根据您的需求,答案有所不同。

Spring为您提供了一个异常层次结构,以便在数据访问API的具体实现之上创建一个抽象层。与数据库进行交互时,可以将它们用于所有常见的异常情况。

异常层次结构使独立的复杂错误处理成为可能 使用的数据访问方法。

抛出的主要异常是DataAccessException,它由CannotCreateRecordExceptionDataIntegrityViolationExceptionCannotAcquireLockException之类的异常专门化。当需要数据但未返回数据时,将抛出EmptyResultDataAccessException

您可以在文档中的org.springframework.dao包的层次结构中找到所有例外。

对于其他方案,例如在服务/ Web层自定义异常管理,您可以为需要它们的每个实体或通用实体创建自定义异常。这取决于您的要求。例如,您可以创建一个EntityNotFoundException,只要通过id进行的搜索什么都不返回就可以抛出该BookNotFoundException。或者,您可以为每个实体创建一个例外,以防您需要对每个实体进行特殊处理,例如AuthorNotFoundExceptionpublic class BookNotFoundException extends RuntimeException { public BookNotFoundException(String id) { super("The book with id " + id + " was not found."); } } 。无论哪种方式,您都必须显式抛出并处理自定义异常。

自定义例外的示例:

BookRepository

引发自定义异常的示例,其中Bookbook实体的存储库,该实体映射到数据库中的@Service public class BookService { private final BookRepository bookRepository; public BookService(BookRepository bookRepository) { this.bookRepository = bookRepository; } public Book findBookById(String id) { return bookRepository.findById(id) .orElseThrow(() -> new BookNotFoundException(id)); } } 表。

https://example.com/article/123