insert()
方法。而ReactiveCrudRepository 依赖 save()
方法来处理新的和已有文档。非响应式 MongoDB Repository 怎么写呢?本章的重点是使用 Spring Data 编写响应式 Repository。但如果出于某种原因,您希望使用非响应式的,可以通过扩展 CrudRepository 或 MongoRepository 接口,而不是扩展 ReactiveCrudRepository 或 ReactiveMongoRepository 来实现。然后,您可以让 Repository 的方法返回添加了 Mongo 注解的实体类型,以及这些类型的集合。但并不是严格要求你必须这样做,你也可以通过改变依赖来实现。把 springboot-starter-data-mongodb-reactive 依赖改为 spring-boot-starterdata-mongodb。
findAll()
方法 返回 Flux<Ingredient>
而不是 Iterable<Ingredient>
。同样地,findById()
将返回 Mono<Ingredient>
而不是 Optional<Ingredient>
。这个变化影响的是端到端响应流的一部分。insert()
方法就很有价值。这是您的新适配了 MongoDB 的 TacoRepository:findByOrderByCreatedAtDesc()
方法还是遵循了,自定义查询方法命名约定。它指出您获取最近的 tacos,并且不需要指定任何参数。然后告诉它按 createdAt 属性降序排列结果。findBy
后面用空的 By
子句,是为了避免对方法名的错误解析。因为方法名中 OrderBy
里有字符 By
。如果起名为 findAllOrderByCreatedAtDesc()
,则名称的 AllOrder 部分将会 忽略,Spring Data 将尝试通过匹配 createdAtDesc 来查找。因为并不存在这样的属性,应用程序将无法启动,会报出一个错误来。findByOrderByCreatedAtDesc()
返回一个 Flux<Taco>,
,所以您不必担心分页。相反,您只需将 take()
操作应用于 Flux 返回的数据上,选择最开始的那一部分。例如,您的 Controller 中可以这样调用 findByOrderByCreatedAtDesc()
方法,以显示最近创建的 tacos:insert()
方法所提供的优化。除此之外,就与其他 Repository 相比就没有什么特别之处了。findByUsername()
方法,这是您在第 4 章中,为支持身份验证而添加的。这里,它被调整为返回 Mono<User>
而不是原始 User 对象。