- bounty将在3天后过期**。回答此问题可获得+50声望奖励。gstackoverflow希望引起更多人关注此问题。
以下代码从ReactiveSecurityContextHolder
返回Mono
@Component
public class SomeClass {
public static Mono<String> issuesID() {
return ReactiveSecurityContextHolder.getContext().switchIfEmpty(Mono.empty()).flatMap((securityContext) -> {
Authentication authentication = securityContext.getAuthentication();
Jwt jwt = (Jwt) authentication.getPrincipal();
String issuer = (String) jwt.getClaims().get("some_claim");
log.info("{}",issuer);
return Mono.justOrEmpty(issuer);
}).switchIfEmpty(Mono.empty());
}
}
我需要像String mutatedId = PREXIX+SomeClass.issuesID();
这样的东西
如果我做以下事情,
PREXIX+SomeClass.issuesID().block();
PREXIX+SomeClass.issuesID().subscribeOn(Schedulers.elastic()).block();
PREXIX+SomeClass.issuesID().toProcessor().block();
PREXIX+SomeClass.issuesID().toFuture().get();
它们都给出相同的误差。
block()/blockFirst()/blockLast() are blocking, which is not supported in thread rector-xxx
我也试过推迟单声道,但也无济于事。
我知道reactor是一个非阻塞的框架,阻塞是令人沮丧的,但在我的情况下,我找不到其他方法来解决这个问题。
我需要将mutatedId传递给mongoFactory,这样我就可以根据每个请求的Jwt属性切换数据库。我不想在控制器中注入@AuthenticationPrincipal
,并不断将其传递给下层,最终在DOA层做出决策。
@Override
public Mono<MongoDatabase> getMongoDatabase(String dbName) throws DataAccessException {
String mutatedId = PREXIX+SomeClass.issuesID();
return super.getMongoDatabase(mutatedId+"@"+dbName);
}
有何建议可达致这个目标,或有何更佳的方法。
1条答案
按热度按时间ddarikpa1#
例如,可以使用
flatMap
。