我正在使用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());
}
任何帮助将不胜感激。
答案 0 :(得分:2)
这里可以做的改进很少。首先,为什么要从REST控制器返回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
中会增加代码的复杂性,同时也使阅读变得更加困难。这应该给您想要的结果。