为什么似乎不叫OrElseGet

时间:2018-08-05 02:04:58

标签: java spring spring-boot lambda java-8

我正在使用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()); 
}

任何帮助将不胜感激。

1 个答案:

答案 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中会增加代码的复杂性,同时也使阅读变得更加困难。这应该给您想要的结果。