【问题标题】:Save Mono with reactive repository使用反应式存储库保存 Mono
【发布时间】:2022-12-17 01:00:26
【问题描述】:

我尝试实现一个反应式端点来保存新的实体实例:

SubjectRepository 中保存的方法仍然需要 Subject 没有 Mono 包装器。但是如何从反应式包装器中提取价值并不清楚。

我应该用request.body(BodyExtractor)Mono<Subject>中提取Subject并调用SubjectRepository.save(Subject s)吗?或者我可以以某种方式将 Mono<> 直接保存到 MongoDB?

这是使用输入主体的正确方法吗?

实体:

@Document
public record Subject(@Id UUID id, String route) {}

@Repository
public interface SubjectRepository extends ReactiveMongoRepository<Subject, UUID> {
}

处理方法:

@NotNull
public Mono<ServerResponse> createSubject(@NotNull ServerRequest request) {
    Mono<Subject> data = subjectRepository
            .save(/** Somehow extract Subject from request */);
    return ServerResponse
            .ok()
            .contentType(MediaType.APPLICATION_JSON)
            .body(data, Subject.class);
}

【问题讨论】:

    标签: java spring-webflux


    【解决方案1】:

    您需要使用响应式运算符构建流,这些运算符将在 web flux 订阅此流时执行。在这种情况下,使用request.bodyToMono 来解析请求正文并继续序列来构造ServerResponse

    public Mono<ServerResponse> createSubject(ServerRequest request) {
            return request.bodyToMono(Subject.class)
                    .flatMap(subject -> subjectRepository.save(subject))
                    .flatMap(newSubject -> 
                            ServerResponse.ok()
                                .contentType(MediaType.APPLICATION_JSON)
                                .bodyValue(newSubject)
                    );
    }
    

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      相关资源
      最近更新 更多