我正在和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);
}发布于 2018-03-16 09:19:08
至少从2.0版本出发,Spring-Data-Jpa修改了findOne()。
现在,findOne()既没有相同的签名,也没有相同的行为。
以前,它在CrudRepository接口中定义为:
T findOne(ID primaryKey);现在,您将在CrudRepository中找到的单个CrudRepository方法是在QueryByExampleExecutor接口中定义为:
<S extends T> Optional<S> findOne(Example<S> example);这最终是由SimpleJpaRepository ( CrudRepository接口的默认实现)实现的。
此方法是通过示例搜索进行的查询,您不希望将其作为替代。
实际上,在新的API中,具有相同行为的方法仍然存在,但是方法名称已经更改。
它在findOne()接口中从findById()重命名为CrudRepository:
Optional<T> findById(ID id); 现在,它返回一个Optional,这对于防止NullPointerException并不是那么糟糕。
因此,要调用的实际方法现在是Optional<T> findById(ID id)**.**
怎么用呢?
学习Optional的用法。以下是有关其规范的重要信息:
可能包含或不包含非空值的容器对象。如果存在一个值,isPresent()将返回true,get()将返回该值。 还提供了依赖于包含的值是否存在的其他方法,如orElse() (如果值不存在则返回默认值)和ifPresent(如果值存在,则执行代码块)。
关于如何在Optional Optional<T> findById(ID id)**.**中使用的一些提示
通常,当您通过id查找实体时,您希望返回它,或者在没有检索到该实体的情况下进行特定的处理。
以下是三个经典用法示例。
你可以写:
Foo foo = repository.findById(id)
.orElse(new Foo());或者获得一个null默认值,如果它有意义的话(与API更改之前相同的行为):
Foo foo = repository.findById(id)
.orElse(null);你可以写:
return repository.findById(id)
.orElseThrow(() -> new EntityNotFoundException(id));你可以写:
Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()) {
Foo foo = fooOptional.get();
// processing with foo ...
} else {
// alternative processing....
}发布于 2018-03-16 10:13:15
该方法已被重命名为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发布于 2018-03-16 09:12:27
实际上,在最新版本的Spring数据中,findOne返回一个可选的。如果希望从可选对象中检索对象,只需在可选对象上使用get()即可。但是,首先,存储库应该将可选项返回给服务,然后服务处理可选选项为空的情况。之后,服务应该将对象返回给控制器。
https://stackoverflow.com/questions/49316751
复制相似问题