我正在使用 SpringBoot 构建 REST API,并决定在 SpringBoot 最新版本中构建它。
我遇到的问题是,由于某种原因,我的代码似乎无法到达OrElseGet
,或者我不知道如何处理Optional
内容.
我想要做的是,如果在数据库中找到该对象,则返回状态代码 200
和实体,如果未找到,则返回状态代码 404
。
但是,当指定无效代码时,我在响应正文中收到字符串 null
和状态代码 200。
这是我的代码:
@GetMapping("/{codigo}")
public ResponseEntity<Optional<Categoria>> searchByCode(@PathVariable Long codigo) {
return Optional
.ofNullable( categoriaRepository.findById(codigo) )
.map(cat-> ResponseEntity.ok().body(cat))
.orElseGet(() -> ResponseEntity.notFound().build());
}
如有任何帮助,我们将不胜感激。
最佳答案
这里可以做的改进很少。首先,为什么您要从 REST Controller 返回 Optional
。我看不出有什么意义。您只需返回 Categoria
对象,然后让 jackson 将其序列化为 json 有效负载。因此更改代码如下。
@RequestMapping(value = "/{codigo}")
public ResponseEntity<Categoria> searchByCode(@PathVariable Long codigo) {
return categoriaRepository.findById(codigo).map(cat -> ResponseEntity.ok().body(cat))
.orElse(ResponseEntity.notFound().build());
}
这是我用来模拟这个的模拟存储库。
public interface CategoriaRepository extends JpaRepository<Categoria, Integer>{
default Optional<Categoria> findById(long codigo) {
// return Optional.ofNullable(new Categoria(1, "name"));
return Optional.ofNullable(null);
}
}
还将响应包装在另一个Optional
中会增加代码的复杂性,同时也使其更难以阅读。这应该会给你想要的结果。
关于java - 为什么 OrElseGet 似乎没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690886/