问题描述
我有这个豆:
@Bean("reactiveNeo4jDatabaseNameProvider")
public ReactiveDatabaseSelectionProvider reactiveDatabaseSelectionProvider() {
log.info("Database selection step");
return () -> getRealmFromContext()
.flatMap(realmId -> {
Flux<String> stringFlux = translateRealmTodbname(realmId);
Mono<DatabaseSelection> next = stringFlux.map(DatabaseSelection::byName).next();
return next;
}
)
.switchIfEmpty(Mono.just(DatabaseSelection.undecided()));
}
其任务是在运行时选择数据库名称,以读取Reactor上下文中包含的一些数据,这些数据由webfilter过滤器功能填充:
public Mono<Void> filter(ServerWebExchange serverWebExchange,WebFilterChain webFilterChain) {
....
return webFilterChain.filter(serverWebExchange)
.subscriberContext(e -> e.put("realmId","some string"));
一切都按预期工作:我可以从db选择器Bean中的上下文中读取内容,但是我需要将选择信息传达回webfilter,后者应在最终响应中添加特定的标头。 我在想像这样的东西
serverWebExchange.getResponse().beforeCommit(() -> {
Mono.subscriberContext().doOnNext(ctx,{
// fetch the selected db value here and add the header
});
});
问题是,如何在上下文中添加一些新内容并通过上面的函数将其提取?
编辑:getRealmFromContext()函数订阅上下文并将其映射以获取领域值。
最好
FB
解决方法
好吧,在挖掘之后,我没有按照我期望的方式进行计算;我只是解决了这个问题
Mono.zip(Mono.just(serverWebExchange.getResponse()),selectionDbService.translateRealmToDbName(realmId))
.subscribe(objects -> objects.getT1().beforeCommit(() -> {
serverWebExchange.getResponse().getHeaders().add(COMPANY_HEADER_NAME_RESPONSE,objects.getT2());
return Mono.empty();
}) );
为了避免两次调用该服务,我使用了一个缓存系统。