我有一个端点,看起来像这样:
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteScooter(@PathVariable long id) {
boolean isDeleted = scootersRepository.deleteById(id);
if (!isDeleted) throw new ResourceNotFoundException("The scooter could not be found with id: " + id);
return ResponseEntity.ok().build();
}
以及相关的deletebyid方法:
@Transactional
@Override
public boolean deleteById(long id) {
boolean isDeleted = false;
try {
Scooter scooterRef = entityManager.getReference(Scooter.class, id);
System.out.println(scooterRef); // <--- this line here
entityManager.remove(scooterRef);
isDeleted = true;
} catch (Exception e) {
// no-op
}
return isDeleted;
}
如果我像上面所示那样保留代码,并调用delete端点传入 unknown id
这将抛出一个 resourceNotFoundException
(预期表现,目前为止一切良好)
但是如果我从deletebyid方法中删除这一特定行:
System.out.println(scooterRef); // <--- this line here
一 internalServerErrorException
而是抛出。
我的问题是,这到底是什么 println
你在做什么?有没有一个更干净的解决方案来执行此代码的预期行为而不使用 println
?
更新:
如果移除 println
并尝试访问引用中的一个属性,如下所示:
// System.out.println(scooterRef);
scooterRef.getMileage(); // <-- ResourceNotFoundException is thrown, good
现在我确实模模糊糊地记得,在某些情况下,您需要以某种方式(例如,通过调用属性)访问引用的对象,以使其完全加载或诸如此类的内容,但我不记得确切的推理了。
1条答案
按热度按时间gg0vcinb1#
你可以试着用
entityManager.find(Scooter.class, id)
;但是从这个博客的解释来看
getReference
只返回一个代理对象,删除时应该完全一样。