【发布时间】:2020-11-20 19:02:27
【问题描述】:
我正在尝试从 Mono 获取 Json 字符串。我尝试使用 block() 方法来获取对象,它工作正常,但是当我使用 map/flatmap 时,我没有看到以下代码行被执行。我看到帐户 Mono 不是空的。
private String getJsonString( Mono<Account> account) {
response.map(it->{
**// call is not coming here**
val json = mapper.writeValueAsString(it)
System.out.println(son)
});
}
我在这里做错了吗?
【问题讨论】:
-
直到有人询问结果,管道才会执行;
map是懒惰的。 -
那么如何从单声道获取 json?我正在尝试调用另一种使用 json 字符串插入数据库的方法。我使用了 subscribe() 但这在大多数情况下都会失败。而且还尝试使用 flatmap 相同的问题方法没有被调用。
-
通常方法是另一种方法应该采用
Mono<String> jsonString。如果完全不可能这样做(例如,您使用的数据库没有响应式驱动程序),那么您需要调用block()以“退出”响应式上下文并检索您的值。 (我认为您所说的“大部分时间都失败”的意思只是您从管道内部输出并且并不总是看到它。如果您将sleep放在您称为subscribe()的地方并给它时间运行,你可能已经看到了。) -
但是当我在我的控制器中使用 flatMap 来调用处理程序方法时,它会使用对象而不是单声道的服务方法?serviceRequest-->单声道-->对象这是如何工作的?
-
如果可能,您的服务应该被重构为接受
Mono。如果这不可能,您必须致电block()并传递结果。 (block()会中断响应式处理,因此它的效率低于传递Mono或Flux,但如果您必须使用非响应式服务,那么您就是这样做的。)
标签: java spring java-stream spring-webflux reactor