我尝试实现一个反应式端点来保存新的实体实例:
方法保存在
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);
}
您需要使用响应式运算符构建流,这些运算符将在 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)
);
}