使用 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 effects
的 doOn
运算符。日志记录是一个 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")。
我正在尝试弄清楚如何使用 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 effects
的 doOn
运算符。日志记录是一个 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")。