无法将用户保存到 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);
});
}
我尝试使用 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);
});
}