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