13.2.2 定义响应式 MongoDB Repository
现在我们需要定义两个 Repository,一个用于 TacoOrder 聚合根,另一个用于 Ingredient。我们不需要 Taco 的 Repository,因为它是 TacoOrder 的一个属性。
您现在应该已经熟悉 IngredientRepository 接口:
package tacos.data;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import org.springframework.web.bind.annotation.CrossOrigin;
import tacos.Ingredient;
@CrossOrigin(origins="*")
public interface IngredientRepository
extends ReactiveCrudRepository<Ingredient, String> {
}
此 IngredientRepository 接口与我们在第 4 章中定义的略有不同,它扩展了 ReactiveCrudRepository,而不是扩展 CrudRepository。且与我们为 Spring Data R2DBC 持久化创建的 Repository 也不一样,不同之处在于它没有 findBySlug()
方法。
同样,OrderRepository 与我们在第 4 章中创建的几乎相同:
package tacos.data;
import org.springframework.data.domain.Pageable;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;
import tacos.TacoOrder;
import tacos.User;
public interface OrderRepository
extends ReactiveCrudRepository<TacoOrder, String> {
Flux<TacoOrder> findByUserOrderByPlacedAtDesc(
User user, Pageable pageable);
}
最后,响应式和非响应式 MongoDB Repository 之间的唯一区别是:它们是否扩展为 ReactiveCrudRepository。在选择扩展 ReactiveCrudRepository 时,这些 Repository 的客户端必须准备好处理响应类型,如 Flux 和 Mono。这一点在我们编写响应式测试时变得显而易见,这是我们下一步要做的。