使用反应式存储库保存 Mono

问题描述 投票:0回答:1

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

方法保存在

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

我应该用

Subject
Mono<Subject>
中提取
request.body(BodyExtractor)
并调用
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 spring-boot spring-webflux project-reactor
1个回答
2
投票

您需要使用响应式运算符构建流,这些运算符将在 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)
                );
}
© www.soinside.com 2019 - 2024. All rights reserved.