Spring响应式环境中首个Mono订阅未执行问题排查
问题原因分析
以下是几种可能导致第一个Mono回调不执行的原因:
目标授权客户端不存在
ReactiveOAuth2AuthorizedClientService.loadAuthorizedClient的核心逻辑是加载已完成授权的客户端记录。如果MYCLIENTID和MYPRINCIPALNAME组合对应的授权记录不存在,这个Mono会直接进入完成状态(onComplete),不会触发onNext回调——也就是你写的打印逻辑根本不会被执行。而Mono.just是直接生成一个包含指定元素的Mono,必然会触发onNext,所以第二个打印正常。未订阅完整的信号回调
你只给第一个Mono注册了onNext的回调,但忽略了onError和onComplete。如果第一个Mono没有元素输出(比如找不到记录),只会走onComplete;如果是执行出错,会走onError,这两种情况都不会触发你的打印。可以修改订阅代码排查:oAuth2AuthorizedClientService.loadAuthorizedClient(MYCLIENTID, MYPRINCIPALNAME) .subscribe( s -> System.out.println("FIRST MONO EXECUTED"), err -> System.out.println("加载失败: " + err.getMessage()), () -> System.out.println("Mono执行完成,无数据返回") );运行后就能明确是无数据还是执行出错。
OAuth2上下文或Bean配置异常
如果ReactiveOAuth2AuthorizedClientService的Bean配置有误(比如没正确关联存储授权数据的数据源),或者当前执行环境缺少必要的OAuth2上下文信息,可能导致loadAuthorizedClient逻辑静默失败或挂起。这种情况一般会触发onError,但因为你没订阅错误回调,所以看不到任何反馈。
内容的提问来源于stack exchange,提问作者Godfried
相关产品推荐
相关产品推荐

