使用 org.slf4j.Logger 从 db 调用记录编码的 (Bcrypt) 密码 Mono<String>

logging an encoded (Bcrypt) password Mono<String> with org.slf4j.Logger from a db call

我正在尝试弄清楚如何使用 slf4j 记录 Mono<String> 密码,但它总是 return Monotype。

logger.info(login.getPassword()+" "+userRepository.findPasswordByUsername(login.getUsername()));

logger.info(login.getPassword()+" "+userRepository.findPasswordByUsername(login.getUsername()).toString());

上面的前 2 次日志记录尝试 return 文字 password (来自请求)和 MonoNext

当然你不能使用 .block()

这只是抛出

"block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-3"

是的,我知道我可以为 onNext() 传递订阅者/消费者,例如:

.subscribe(x -> System.out.println( x.toString()))

获得一些输出,但我如何仅使用记录器来实现,有什么办法吗?

login 表示从请求中检索到的用户。 密码事先正确存储和编码(Bycrypt)(似乎不是问题)。

编辑:提供更多上下文 userRepository.findPasswordByUsername("username") 将 return 一个单声道,我想将其与另一个密码进行比较,如:

passwordEncoder.matches( "userinputPW", userRepository.findPasswordByUsername("username") )

这就是你在 Spring 中使用 ByCryptEncoder 的方式,我不能 .map() 将 Mono 转换为字符串(显然总是 return 对象而不是字符串,如前所述这里 )

使用 spring-boot-starter-webflux,spring-boot-starter-data-r2dbc,spring-boot-starter-security

我错过了什么?提前致谢。

这是正确的,你不应该在反应式应用程序中阻塞,你也不应该在这个用户案例中订阅,因为你的应用程序很可能是生产者os,而调用客户端是订阅的消费者。

您正在寻找的是处理 side effectsdoOn 运算符。日志记录是一个 side effect,它是你想在不干扰当前流程的情况下做的事情。例如更新一些东西,增加一些东西,或者在你的情况下写入日志。

你想要什么os可能是doOnSuccess运算符

示例(自从我在移动设备上以来,我就没有对编译器进行过攻击),但是像这样。

function Mono<Login> foobar(Login login) {
    return userRepository.findPasswordByUsername(login.getUsername)
                .doOnSuccess(pwd -> {
                    logger.info(login.getPassword() + " " + pwd);
                }).thenReturn(login);
}

由于还没有人想出答案,

logger.info("userName :" +userMono.map(user -> user.getUsername()).share().block());

.share() 将允许 .block()

来自文档: “准备一个共享此 Mono 结果的 Mono,类似于 Flux.shareNext()。当第一个订阅者使用 subscribe() API 订阅时,这将有效地将此 Mono 变成热门任务。更多订阅者将共享相同的结果订阅,因此 result.It 值得注意,这是一个 un-cancellable 订阅。” 对我有用(即使它包含 .block()

userMono.subscribe(user -> logger.info("username: "+user.getUsername()));

将return一个Disposable

两者都将为记录器输出 String 值。

在旁注(我不知道)上有一个运算符 .log("callerForADefinedLogger")。