当用户使用无效ID搜索我的repo时,我想抛出一个自定义错误类。这应该是非常直接的,但我似乎无法捕获JpaRepository抛出的任何错误。我已经尝试过几次解决这个问题,但以下是我最直接的尝试:
try {
Object obj = repository.getOne(id)
}
catch (EntityNotFoundException e) {
throw CustomException("message");
}
字符串
当在调试器中运行这个函数时,repository抛出了我期望的javax.persistence.EntityNotFoundException
异常,但是代码只是跳过了我的catch语句,函数返回一个错误。
我试着用repository.findById(id)
得到了类似的结果。我也试着捕捉Exception
和Throwable
。有什么想法吗?如果我的问题没有立即显现出来,我会在我的帖子中添加更多信息。
4条答案
按热度按时间6tdlim6h1#
getOne()
只是EntityManager.getReference()
的一个 Package 器。该方法不会抛出任何异常。它返回一个未初始化的代理,假设实体确实存在。它不从数据库获取实体状态,因此甚至不知道它是否存在。它假设它存在。
如果您尝试访问实体的状态,则稍后只会得到一个异常。
使用
findById()
/findOne()
,检查是否得到非空/非null结果(因为如果实体不存在,这些方法不会抛出任何异常,它们返回空或null),如果是这种情况,则抛出异常。rkttyhzu2#
你可以试试这个:
字符串
2q5ifsrm3#
您需要使用@Repository annotation来注解您的repository类,以执行对特定持久性异常的异常 Package 。
关于这个问题-你不需要使用getOne()来处理潜在的异常,但是可以使用一些其他的方法,而不会在实体不存在的情况下抛出错误,比如findById()或其他返回Optional<>对象的方法。
wa7juj8i4#
你可以捕获
DataAccessException
而不是EntityNotFoundException
字符串