为什么Spring数据存储库上的getOne(...)不会抛出EntityNotFoundException?

时间:2015-08-28 06:37:59

标签: java spring jpa spring-data spring-data-jpa

我正在处理一个奇怪的问题,我正在进行集成测试,调用我的控制器从数据库中获取一个不存在的对象。

public Optional<T> get(Long id) {

  try {
    return Optional.ofNullable(repository.getOne(id));
  } catch(EntityNotFoundException e) {
    return Optional.empty();
  }
}

getOne(…)无法找到任何内容时,我期待EntityNotFoundException但实际上没有任何内容。如果我检查我的结果,我可以看到我有一个空的实体,其中有一个处理程序链接“扔EntityNotFoundException”但是我们没有进入catch并且我返回一个可选的这个奇怪的实体。

我无法理解这种行为。

2 个答案:

答案 0 :(得分:29)

这是由于JPA指定public abstract class RestCallback<T> implements Callback<T> { public abstract void success(T t, Response response, boolean inCache); @Override public void success(T t, Response response) { // todo success(t, response, false); } @Override public void failure(RetrofitError error) { // todo } } 的工作方式。它应该返回一个代理,它将在第一次访问属性时解析要返回的对象,或者最终抛出包含的异常。

解决此问题的最简单方法是简单地使用EntityManager.getReference(…),例如findOne(…)。如果找不到结果,Optional.ofNullable(repository.findOne(…))将返回findOne(…)

解决此问题的更高级方法是使存储库直接返回null个实例。这可以通过使用Optional创建自定义基本存储库接口作为Optional<T> - 方法的返回类型来实现。

find…

Spring Data examples repository中找到完整的示例。

答案 1 :(得分:2)

这就是我的工作方式

public User findUserById(Long id) {
    return userRepository.findById(id).orElse(null);
}