我正在处理一个奇怪的问题,我正在进行集成测试,调用我的控制器从数据库中获取一个不存在的对象。
public Optional<T> get(Long id) {
try {
return Optional.ofNullable(repository.getOne(id));
} catch(EntityNotFoundException e) {
return Optional.empty();
}
}
当getOne(…)
无法找到任何内容时,我期待EntityNotFoundException
但实际上没有任何内容。如果我检查我的结果,我可以看到我有一个空的实体,其中有一个处理程序链接“扔EntityNotFoundException
”但是我们没有进入catch并且我返回一个可选的这个奇怪的实体。
我无法理解这种行为。
答案 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);
}