问题描述
迁移旧数据库,我为数据库中的每个重要表创建了一个实体类,然后为它们中的每个创建了一个附加的存储库类。最好为每个实体创建一个异常类,还是为所有实体或它们创建一个全局的异常类?
解决方法
您需要处理哪种异常?根据您的需求,答案有所不同。
Spring为您提供了一个异常层次结构,以便在数据访问API的具体实现之上创建一个抽象层。与数据库进行交互时,可以将它们用于所有常见的异常情况。
异常层次结构使独立的复杂错误处理成为可能 使用的数据访问方法。
抛出的主要异常是DataAccessException
,它由CannotCreateRecordException
,DataIntegrityViolationException
和CannotAcquireLockException
之类的异常专门化。当需要数据但未返回数据时,将抛出EmptyResultDataAccessException
。
您可以在文档中的org.springframework.dao包的层次结构中找到所有例外。
对于其他方案,例如在服务/ Web层自定义异常管理,您可以为需要它们的每个实体或通用实体创建自定义异常。这取决于您的要求。例如,您可以创建一个EntityNotFoundException
,只要通过id进行的搜索什么都不返回就可以抛出该BookNotFoundException
。或者,您可以为每个实体创建一个例外,以防您需要对每个实体进行特殊处理,例如AuthorNotFoundException
和public class BookNotFoundException extends RuntimeException {
public BookNotFoundException(String id) {
super("The book with id " + id + " was not found.");
}
}
。无论哪种方式,您都必须显式抛出并处理自定义异常。
自定义例外的示例:
BookRepository
引发自定义异常的示例,其中Book
是book
实体的存储库,该实体映射到数据库中的@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