Seb*_*Seb 23 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();
}
}
Run Code Online (Sandbox Code Playgroud)
什么时候getOne(…)
找不到什么东西,我一直在期待,EntityNotFoundException
但实际上什么都没有.如果我检查我的结果,我可以看到我有一个空实体,其中有一个处理程序链接"扔EntityNotFoundException
"但我们没有进入catch并且我返回一个可选的这个奇怪的实体.
我无法理解这种行为.
Oli*_*ohm 33
这是由于JPA指定EntityManager.getReference(…)
的工作方式.它应该返回一个代理,它将在第一次访问属性时解析要返回的对象,或者最终抛出包含的异常.
解决这个问题最简单的方法就是简单地使用findOne(…)
,就像这样Optional.ofNullable(repository.findOne(…))
.如果没有找到结果,findOne(…)
将返回null
.
解决此问题的更高级方法是使存储库Optional
直接返回实例.这可以通过使用-methods的Optional<T>
返回类型创建自定义基本存储库接口来实现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> { … }
Run Code Online (Sandbox Code Playgroud)
在Spring Data示例存储库中找到完整的示例.
在 Spring@Repository
类中,在getOne(id)
查询对象(通过调用entity.getId()
或其他方式)之前,该方法并不总是验证存在,因此它的无此类实体异常可能会延迟。要立即验证,请findById(id)
改用(Optional<EntityType>
如果具有该 id 的实体不存在,它将返回一个空值)。
这就是它对我的工作方式
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
16389 次 |
最近记录: |