java - 为什么 OrElseGet 似乎没有被调用

标签 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()); 
}

如有任何帮助,我们将不胜感激。

最佳答案

这里可以做的改进很少。首先,为什么您要从 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/

相关文章:

java - 否定正则表达式捕获组

java - 在哪里初始化派生字段?

java - 仅在重构包名称之后,才考虑在配置中定义 * 类型的 bean

java - 为什么在 Spring Boot 中检索 mysql View 时出现 "unknown column"错误?

java - Tomcat7 上的 JSF 与 Java6 系统时间显示委内瑞拉时间

java - Spring Security 数据库身份验证将 Spring 用户转换为域用户

java - 要求在 Java 构建器中填充字段的某些模式

java - Spring - 设计实用模块

java - 在 IntelliJ IDE 中找不到 Spring Assistant 插件

java - 将继承类的对象分配给父类(super class)对象