首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring ()改为可选的,如何使用?

Spring ()改为可选的,如何使用?
EN

Stack Overflow用户
提问于 2018-03-16 09:05:20
回答 7查看 197.7K关注 0票数 96

我正在和SpringBoot2.0一起学习Java8

我学习了一些博客制作教程的例子。

教程的源代码是:

代码语言:javascript
复制
@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方法:

代码语言:javascript
复制
public Category findOne(Long id) {
  return categoryRepository.findOne(id);
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2018-03-16 09:19:08

至少从2.0版本出发,Spring-Data-Jpa修改了findOne()

现在,findOne()既没有相同的签名,也没有相同的行为。

以前,它在CrudRepository接口中定义为:

代码语言:javascript
复制
T findOne(ID primaryKey);

现在,您将在CrudRepository中找到的单个CrudRepository方法是在QueryByExampleExecutor接口中定义为:

代码语言:javascript
复制
<S extends T> Optional<S> findOne(Example<S> example);

这最终是由SimpleJpaRepository ( CrudRepository接口的默认实现)实现的。

此方法是通过示例搜索进行的查询,您不希望将其作为替代。

实际上,在新的API中,具有相同行为的方法仍然存在,但是方法名称已经更改。

它在findOne()接口中从findById()重命名为CrudRepository

代码语言:javascript
复制
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查找实体时,您希望返回它,或者在没有检索到该实体的情况下进行特定的处理。

以下是三个经典用法示例。

  1. 假设如果找到了该实体,您希望得到它,否则您希望得到一个默认值。

你可以写:

代码语言:javascript
复制
Foo foo = repository.findById(id)
                    .orElse(new Foo());

或者获得一个null默认值,如果它有意义的话(与API更改之前相同的行为):

代码语言:javascript
复制
Foo foo = repository.findById(id)
                    .orElse(null);
  1. 假设如果找到了该实体,则要返回它,否则要抛出异常。

你可以写:

代码语言:javascript
复制
return repository.findById(id)
        .orElseThrow(() -> new EntityNotFoundException(id));
  1. 假设您希望根据实体是否找到(而不一定抛出异常)应用不同的处理。

你可以写:

代码语言:javascript
复制
Optional<Foo> fooOptional = fooRepository.findById(id);
if (fooOptional.isPresent()) {
    Foo foo = fooOptional.get();
    // processing with foo ...
} else {
    // alternative processing....
}
票数 240
EN

Stack Overflow用户

发布于 2018-03-16 10:13:15

该方法已被重命名为findById(…),返回一个Optional,因此您必须自己处理缺勤:

代码语言:javascript
复制
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
票数 13
EN

Stack Overflow用户

发布于 2018-03-16 09:12:27

实际上,在最新版本的Spring数据中,findOne返回一个可选的。如果希望从可选对象中检索对象,只需在可选对象上使用get()即可。但是,首先,存储库应该将可选项返回给服务,然后服务处理可选选项为空的情况。之后,服务应该将对象返回给控制器。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49316751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档