无法将用户保存到 Spring 中的 mongodb 5 WebFlux

Can't save user to mongodb in Spring 5 WebFlux

我尝试使用 Spring WebFlux 以响应式方式将用户保存到 Mongo 数据库,但数据未保存,所以我有 Java 8,Spring 5 和 mongodb.

这是我的配置:

我的实体:

@Document
public class User {
    @Id
    private String id;
    private String username;
    private String password;
}

我的存储库:

public interface UserRepository extends ReactiveMongoRepository<User, String> {
}

我的网络配置:

@Configuration
@EnableWebFlux
public class WebConfig {

    @Autowired
    private UserRepository userRepository;

    @Bean
    public RouterFunction userRoutes() {
        return route(POST("/admin/users").and(accept(APPLICATION_JSON)),
                        request -> {
                            Mono<User> user = request.bodyToMono(User.class);
                            Mono<User> userMono = user.doOnNext(userRepository::save)
                            return ServerResponse.().body(userMono, User.class);
                        });
    }
}

可能我必须在保存到存储库后手动执行订阅,但我没有在 spring 参考资料中找到这样的信息?

更新: 但是,如果我从请求用户中提取并将其传递给 userRepository 和 return 结果,我将成功地将数据保存到 mongo。但我不确定这是一个好方法:

@Bean
public RouterFunction userRoutes() {
    return route(POST("/admin/users").and(accept(APPLICATION_JSON)),
                    request -> {
                        User user = request.bodyToMono(User.class).block();
                        Mono<User> userMono = userRepository.save(user);
                        return ServerResponse.ok().body(userMono, User.class);
                    });
}

我已经将 doOnNext 更改为 flatMap 并且它有效,所以在我看来这是由于 "Transform the item emitted by this Mono asynchronously, returning the value emitted by another Mono" 和 doOnNext - "Add behavior triggered when the Mono emits a data successfully" 和 userRepository.save(... ) 方法 return doOnNext 添加行为到旧 Mono 的 Mono 和 return 它(我失去了保存方法的响应)和 flatMap return 从保存方法获得的新 Mono:

@Bean
public RouterFunction userRoutes() {
    return route(POST("/admin/users").and(accept(APPLICATION_JSON)),
                    request -> {
                        Mono<User> user = request.bodyToMono(User.class);
                            Mono<User> userMono = user.flatMap(userRepository::save);
                            return ServerResponse.status(HttpStatus.CREATED).body(userMono, User.class);
                    });
}