我正在学习 SpringBoot2.0
和 Java8
。
我遵循了一些博客制作教程示例。
教程源代码为:
@GetMapping("/{id}/edit")
public String edit(@PathVariable Long id, Model model) {
model.addAttribute("categoryDto", categoryService.findOne(id));
return "category/edit";
}
但是这段代码抛出了这个错误:
categoryService.findOne(id)
我正在考虑将 JPA findOne()
方法更改为 Optional< S >
如何解决?
更多信息:
这是 categoryService 方法:
public Category findOne(Long id) {
return categoryRepository.findOne(id);
}
原文由 Hulk Choi 发布,翻译遵循 CC BY-SA 4.0 许可协议
至少从
2.0
版本,Spring-Data-Jpa
修改findOne()
。现在,
findOne()
既没有相同的签名也没有相同的行为。之前在
CrudRepository
接口中定义为:现在,您将在
CrudRepository
中找到的单个findOne()
方法是在QueryByExampleExecutor
接口中定义的方法:最终由
SimpleJpaRepository
实现,这是CrudRepository
接口的默认实现。此方法是通过示例搜索进行查询,您不希望将其作为替代方法。
实际上,具有相同行为的方法仍然存在于新 API 中,只是方法名称发生了变化。
它在
CrudRepository
接口中从findOne()
重命名为findById()
:现在它返回一个
Optional
,这对于防止NullPointerException
来说还不错。因此,现在调用的实际方法是
Optional<T> findById(ID id)
。怎么用?
学习
Optional
用法。以下是有关其规格的重要信息:关于如何使用
Optional
和Optional<T> findById(ID id)
的一些提示。通常,当您通过 id 查找实体时,如果没有检索到,您希望返回它或进行特定处理。
以下是三个经典用法示例。
你可以写:
或获取
null
默认值(如果有意义)(与 API 更改之前的行为相同):你可以写:
你可以写: