Hul*_*hoi 43 java spring spring-data-jpa
我正在学习SpringBoot2.0
用Java8
.
我遵循了一些博客制作教程示例.
教程源代码是:
@GetMapping("/{id}/edit")
public String edit(@PathVariable Long id, Model model) {
model.addAttribute("categoryDto", categoryService.findOne(id));
return "category/edit";
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码抛出了这个错误:
categoryService.findOne(ID)
我正在考虑将JPA findOne()
方法更改为Optional< S >
怎么解决?
更多信息:
这是categoryService方法:
public Category findOne(Long id) {
return categoryRepository.findOne(id);
}
Run Code Online (Sandbox Code Playgroud)
dav*_*xxx 115
至少,2.0
版本,Spring-Data-Jpa
修改findOne()
.
现在,findOne()
没有相同的签名和相同的行为.
以前,它在CrudRepository
界面中定义为:
T findOne(ID primaryKey);
Run Code Online (Sandbox Code Playgroud)
现在,findOne()
您将找到的单个方法CrudRepository
是在QueryByExampleExecutor
接口中定义的方法:
<S extends T> Optional<S> findOne(Example<S> example);
Run Code Online (Sandbox Code Playgroud)
最后通过接口SimpleJpaRepository
的默认实现来CrudRepository
实现.
此方法是通过示例搜索查询,您不希望将其作为替换.
实际上,具有相同行为的方法仍然存在于新API中,但方法名称已更改.
它是从更名findOne()
到findById()
的CrudRepository
接口:
Optional<T> findById(ID id);
Run Code Online (Sandbox Code Playgroud)
现在它返回一个Optional
.哪个不是很难预防NullPointerException
.
所以,现在要调用的实际方法Optional<T> findById(ID id)
.
怎么用?
学习Optional
用法.这里有关于其规格的重要信息:
容器对象,可能包含也可能不包含非null值.如果存在值,则isPresent()将返回true,get()将返回该值.
提供依赖于是否存在包含值的其他方法,例如orElse()(如果值不存在则返回默认值)和ifPresent()(如果值存在则执行代码块).
关于如何使用的一些提示Optional
用Optional<T> findById(ID id)
.
通常,当您按ID查找实体时,如果未检索到该实体,则要返回该实体或进行特定处理.
这里有三个经典的用例.
1)假设如果找到实体你想要得到它,否则你想得到一个默认值.
你可以写:
Foo foo = repository.findById(id)
.orElse(new Foo());
Run Code Online (Sandbox Code Playgroud)
或者null
如果它有意义,则获取默认值(与API更改之前的行为相同):
Foo foo = repository.findById(id)
.orElse(null);
Run Code Online (Sandbox Code Playgroud)
2)假设如果找到实体你想要返回它,否则你想抛出异常.
你可以写:
return repository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(id));
Run Code Online (Sandbox Code Playgroud)
3)假设您希望根据是否找到实体来应用不同的处理(无需抛出异常).
你可以写:
Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()){
Foo foo = fooOptional.get();
// processing with foo ...
}
else{
// alternative processing....
}
Run Code Online (Sandbox Code Playgroud)
事实上,在最新版本的 Spring Data 中,findOne 返回一个可选值。如果你想从Optional中检索对象,你可以简单地在Optional上使用get()。首先,存储库应该将可选值返回给服务,然后服务处理可选值为空的情况。之后,服务应该将对象返回给控制器。
该方法已重命名为findById(…)
返回,Optional
因此您必须自己处理缺席情况:
Optional<Foo> result = repository.findById(…);
result.ifPresent(it -> …); // do something with the value if present
result.map(it -> …); // map the value if present
Foo foo = result.orElse(null); // if you want to continue just like before
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
71107 次 |
最近记录: |