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 的方式,您需要以某种方式考虑到这一点。这可能看起来是一件小事,但由于多种原因,它实际上非常强大。
如果您在代码库中坚持使用 Optional,那么您基本上可以消除可怕的 null-check。如果你总是在某些东西可能为 null 时使用一个可选的,那么你暗示所有不是可选的东西都不是 null,所以你得到的任何空指针都是代码中逻辑错误的结果(你知道你需要修复)。
Optionals 与流 API 配合得很好。这是一个太大的话题,无法在这里涵盖,但基本上,许多程序流程都非常简单。如果我们有该项目,我们会尝试对其执行一系列操作,但如果没有,则我们不会或抛出异常。尝试一下,在你尝试之后你会更加欣赏 Optionals。我认为它会产生真正可读的代码。
许多包都支持 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");
}
我的服务文件中有以下方法:
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 的方式,您需要以某种方式考虑到这一点。这可能看起来是一件小事,但由于多种原因,它实际上非常强大。
如果您在代码库中坚持使用 Optional,那么您基本上可以消除可怕的 null-check。如果你总是在某些东西可能为 null 时使用一个可选的,那么你暗示所有不是可选的东西都不是 null,所以你得到的任何空指针都是代码中逻辑错误的结果(你知道你需要修复)。
Optionals 与流 API 配合得很好。这是一个太大的话题,无法在这里涵盖,但基本上,许多程序流程都非常简单。如果我们有该项目,我们会尝试对其执行一系列操作,但如果没有,则我们不会或抛出异常。尝试一下,在你尝试之后你会更加欣赏 Optionals。我认为它会产生真正可读的代码。
许多包都支持 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");
}