Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot 在doOnError中找不到订阅服务器上下文_Spring Boot_Project Reactor - Fatal编程技术网

Spring boot 在doOnError中找不到订阅服务器上下文

Spring boot 在doOnError中找不到订阅服务器上下文,spring-boot,project-reactor,Spring Boot,Project Reactor,我想知道是否有人能看到下面的代码片段,并告诉我为什么doon错误中的SubscriberContext没有触发 公共Mono handlePlatformAuthenticationResponse(最终服务器请求服务器请求){ Mono-formData=serverRequest.body(BodyExtractors.toFormData()); 返回表单数据 .flatMap(this::provisionUserAndClass) .flatMap(元组->Mono.subscribe

我想知道是否有人能看到下面的代码片段,并告诉我为什么doon错误中的SubscriberContext没有触发

公共Mono handlePlatformAuthenticationResponse(最终服务器请求服务器请求){
Mono-formData=serverRequest.body(BodyExtractors.toFormData());
返回表单数据
.flatMap(this::provisionUserAndClass)
.flatMap(元组->Mono.subscriberContext()
.map(上下文->{
//如果provisionUserAndClass成功完成,将调用此函数
遥测数据遥测数据=上下文.get(遥测数据);
LTILaunchRequest launchRequest=tuple.getT2();
此.addLaunchDetailsToTelemetryContext(launchRequest,telemetryData);
返回元组;
}))
.doError(错误->Mono.subscriberContext()
.map(上下文->{
//如果provisionUserAndClass返回Mono.error,则永远不会调用此函数
遥测数据遥测数据=上下文.get(遥测数据);
//日志遥测数据+错误消息
}))
.subscriberContext(context->context.put(遥测数据,新遥测数据());
}
专用Mono provisionUserAndClass(
LTILaunchRequest(LTILaunchRequest){
//返回Mono.error只是为了在错误发生时查看Mono.subscriberContext()的行为。实际代码将调用服务方法
返回Mono.error(新的ProvisioningException(“假”));
}

若要在发生错误时访问上下文,可以使用运算符:

.doOnEach(信号->{
if(signal.isOnError())
{
遥测数据遥测数据=signal.getContext().get(遥测数据);
Throwable error=signal.getThrowable();
// ...
}
})
Mono.subscriberContext()
只能在必须返回Mono的操作符(如flatMap、concatMap等)中有意义地使用,但不能在没有订阅
Mono
的副作用操作符中使用


您忘记订阅
Mono.subscriberContext()。

尝试返回Mono.error而不是抛出异常我让provisionUserAndClass()返回Mono.error而不是RuntimeException,但它仍然没有进入Mono.subscriberContext()的映射在Doonerror中向我们展示codeI注释掉了处理程序方法“provisionUserAndClass”对服务的调用,并让它返回Mono.error,只是为了看看这是否有效。请用代码更新您的问题,不要在注释中发布,这是无法理解的谢谢您的建议。我将在这里测试和更新它
.doOnError(error -> Mono.subscriberContext()
                    .map(context -> {
                    // this is never invoked if provisionUserAndClass returns a Mono.error
                     TelemetryData telemetryData = context.get(TELEMETRY_DATA);
                     // log telemetryData + error message
                    }).subscribe())