【发布时间】:2022-01-26 22:21:13
【问题描述】:
我正在尝试弄清楚如何使用 slf4j 记录 Mono<String> 密码,但它总是会返回 Monotype。
logger.info(login.getPassword()+" "+userRepository.findPasswordByUsername(login.getUsername()));
和
logger.info(login.getPassword()+" "+userRepository.findPasswordByUsername(login.getUsername()).toString());
上面的前 2 次日志记录尝试
返回文字 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")
将返回一个我想与另一个密码进行比较的 Mono:
passwordEncoder.matches( "userinputPW", userRepository.findPasswordByUsername("username") )
这就是你在 Spring 中使用 ByCryptEncoder 的方式,我不能 .map() 将 Mono 转换为字符串(显然总是会返回一个对象,而不是这里解释的字符串 https://stackoverflow.com/a/47180610/6414816)
使用 spring-boot-starter-webflux、spring-boot-starter-data-r2dbc、spring-boot-starter-security
我错过了什么?提前致谢。
【问题讨论】:
-
您的密码表示为 Mono 类而不是字符串。通过在互联网上的快速搜索,Mono 是一个 0..1 元素的流,您可以尝试 login.getPassword().block() 来获取字符串值虽然这可能有效,但我建议您阅读有关 Mono 、 Flux 的更多信息, java 反应式编程
标签: java spring spring-boot spring-security spring-webflux