我正在处理一个奇怪的问题,我正在做集成测试,调用我的 Controller 从数据库中获取一个不存在的对象。
public Optional<T> get(Long id) {
try {
return Optional.ofNullable(repository.getOne(id));
} catch(EntityNotFoundException e) {
return Optional.empty();
}
}
当 getOne(…)
找不到任何东西时,我期待 EntityNotFoundException
但实际上什么也没有。如果我检查我的结果,我可以看到我有一个带有指向它的处理程序链接的空实体“抛出 EntityNotFoundException
”,但我们没有进入 catch 并且我返回这个奇怪实体的可选。
我无法理解这种行为。
最佳答案
这是由于 JPA 指定 EntityManager.getReference(…)
的方式造成的。去工作。它应该返回一个代理,该代理将解析在第一次访问属性时返回的对象或最终抛出包含的异常。
解决此问题的最简单方法是简单地使用 findOne(…)
相反,像这样 Optional.ofNullable(repository.findOne(…))
. findOne(…)
将返回 null
如果没有找到结果。
解决此问题的更高级方法是使存储库返回 Optional
直接实例。这可以通过使用 Optional<T>
创建自定义基础存储库接口(interface)来实现。作为 find…
的返回类型-方法。
interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
Optional<T> findOne(ID id);
// declare additional methods if needed
}
interface YourRepository extends BaseRepository<DomainClass, Long> { … }
在 Spring Data examples repository 中找到完整的示例.
关于java - 为什么 Spring Data 存储库上的 getOne(...) 不会抛出 EntityNotFoundException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32264758/