Spring JPA Repository无法捕获异常NotFoundException

bfrts1fy  于 12个月前  发布在  Spring
关注(0)|答案(4)|浏览(261)

当用户使用无效ID搜索我的repo时,我想抛出一个自定义错误类。这应该是非常直接的,但我似乎无法捕获JpaRepository抛出的任何错误。我已经尝试过几次解决这个问题,但以下是我最直接的尝试:

try {
    Object obj = repository.getOne(id)
}
catch (EntityNotFoundException e) {
    throw CustomException("message");
}

字符串
当在调试器中运行这个函数时,repository抛出了我期望的javax.persistence.EntityNotFoundException异常,但是代码只是跳过了我的catch语句,函数返回一个错误。
我试着用repository.findById(id)得到了类似的结果。我也试着捕捉ExceptionThrowable。有什么想法吗?如果我的问题没有立即显现出来,我会在我的帖子中添加更多信息。

6tdlim6h

6tdlim6h1#

getOne()只是EntityManager.getReference()的一个 Package 器。该方法不会抛出任何异常。
它返回一个未初始化的代理,假设实体确实存在。它不从数据库获取实体状态,因此甚至不知道它是否存在。它假设它存在。
如果您尝试访问实体的状态,则稍后只会得到一个异常。
使用findById()/findOne(),检查是否得到非空/非null结果(因为如果实体不存在,这些方法不会抛出任何异常,它们返回空或null),如果是这种情况,则抛出异常。

rkttyhzu

rkttyhzu2#

你可以试试这个:

try {
    Object obj = repository.findById(id).orElseThrow(EntityNotFoundException::new);
}
catch (EntityNotFoundException e) {
    throw CustomException("message");
}

字符串

2q5ifsrm

2q5ifsrm3#

您需要使用@Repository annotation来注解您的repository类,以执行对特定持久性异常的异常 Package 。
关于这个问题-你不需要使用getOne()来处理潜在的异常,但是可以使用一些其他的方法,而不会在实体不存在的情况下抛出错误,比如findById()或其他返回Optional<>对象的方法。

wa7juj8i

wa7juj8i4#

你可以捕获DataAccessException而不是EntityNotFoundException

try {
    Object obj = repository.getOne(id)
}
catch (DataAccessException e) {
    throw CustomException("message");
}

字符串

相关问题