Java Spring 启动 - MongoDB findById 编译错误

Java Spring Boot - MongoDB findById compilation error

我的服务文件中有以下方法:

public MappingModel getById(String id) {
        return repository.findById(id);
    }

这是我的存储库:

public interface MappingRepository extends MongoRepository<MappingModel, String> {

    List<MappingModel> findByProject(String project);

}

编译时出现以下错误:

incompatible types: java.util.Optional<com.xxx.xxx.xxx.model.MappingModel> cannot be converted to com.xxx.xxx.xxx.model.MappingModel

我的服务应该return什么类型?不应该是模型本身(我目前正在尝试 return)?

谢谢

您应该 returning 的类型在错误消息中。 findById() returns an Optional<MappingModel>,因此您可以将服务的 return 类型更改为 Optional<MappingModel> 或者您可以处理服务中的 Optional。

https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

编辑以向提问者提供有关可选选项的更多信息:

作为一名程序员,您可能遇到过数千次可怕的 NullPointerException。 Java 的一个大问题是当你查看一个参数时,真的很难判断它是否可以为空或者它是否保证存在,所以通常最终发生的是你的整个代码库都被填满了使用空检查(这对于嵌套对象尤其糟糕)。

Optionals 是一种明确说明此对象有可能为 null 的方式,您需要以某种方式考虑到这一点。这可能看起来是一件小事,但由于多种原因,它实际上非常强大。

  1. 如果您在代码库中坚持使用 Optional,那么您基本上可以消除可怕的 null-check。如果你总是在某些东西可能为 null 时使用一个可选的,那么你暗示所有不是可选的东西都不是 null,所以你得到的任何空指针都是代码中逻辑错误的结果(你知道你需要修复)。

  2. Optionals 与流 API 配合得很好。这是一个太大的话题,无法在这里涵盖,但基本上,许多程序流程都非常简单。如果我们有该项目,我们会尝试对其执行一系列操作,但如果没有,则我们不会或抛出异常。尝试一下,在你尝试之后你会更加欣赏 Optionals。我认为它会产生真正可读的代码。

  3. 许多包都支持 Optional,因此它们可能会为您处理。例如,如果此对象存在,那么我们将 return 它作为 JSON 响应的一部分。否则,我们将忽略它。

从 use-case 的角度,想想使用像列表这样的集合是什么感觉。我们通常期望 List 永远不会为空,只是空的,所以使用它们感觉很好。 Optionals 有点像这个的扩展(许多流 API 方法被重载以处理 Collections 和 Optionals)。

当您使用 MongoRepository 的 findById() 时,它会给您一个 Optional<> 类型,这意味着该数据可以存在于数据库中,也可以不存在。所以像下面这样改变类型

 public Optional<MappingModel> getById(String id) {
        return repository.findById(id);
    }

在服务实现中使用该方法时,需要使用,

public MappingModel getById(String id){
   if(repository.getById(id).isPresent())
   {
       MappingModel m= repository.getById(id).get();
       // then your usual logic
       return m;
   }
   throw new RuntimeException("Data not found");
}