春季网络通量。在反应流之间切换

SpringWebflux. Switch between reactive streams

我尝试在数据库中创建一条新记录,但在我需要获取另一条记录并从中获取一些数据并将其设置为新记录之前。它假设 Mono<Subject> subject 将在 subject.doOnNext(child -> {...}) 中填充数据,然后用 subjectRepository::insert 插入到数据库中,但是没有任何反应也没有错误,只是没有插入对象。

public Mono<Subject> create(Mono<Subject> subject) {
    return subject
            .flatMap(s -> subjectRepository.findById(s.getParentId()))
            .flatMap(parent ->
                    subject.doOnNext(child -> {
                        child.setParentId(parent.getId());
                        child.setCreatedDate(LocalDateTime.now());
                        child.setRoute(Utils.buildRoute(child, parent));
                    }))
            .flatMap(subjectRepository::insert);
}

我的错误是什么以及如何解决?

试试这个片段。

return subject
    .flatMap(s -> {
        return repository.findById(s.getParentId())
                .flatMap(p-> {
            s.setParentId(p.getId());
            s.setCreatedDate(LocalDateTime.now());
            s.setRoute(Utils.buildRoute(s, p));
            return repository.save(s);
        });
    });

subject.doOnNext 从未被订阅,因此从未被实际执行。此外,doOn*** 运算符是“副作用”运算符,您不应在其中实施业务逻辑或 I/O 操作。你可以尝试这样的事情:

return subject
    .flatMap(s -> subjectRepository.findById(s.getParentId())
        .map(parent -> {
          s.setParentId(parent.getId());
          s.setCreatedDate(LocalDateTime.now());
          s.setRoute(Utils.buildRoute(child, parent));
          return s;
        }))
    .flatMap(subjectRepository::insert);