ReactiveRedisTemplate opsForValue().set不起作用



我正在尝试将oauth登录凭据保存在redis中。使用spring-oauth2库和spring-redis。

我的saveAuthorizedClient方法应该将key/val对保存在redis中,但没有保存任何内容。已经附加了一个调试器,并且键值对被正确分配,它的reactiveOauthRedisTemplate.opsForValue((.set(key,authorizedClient(似乎什么都没做。


class CustomClientService(
val reactiveClientRegistrationRepository: ReactiveClientRegistrationRepository,
val reactiveOauthRedisTemplate: ReactiveRedisTemplate<String, OAuth2AuthorizedClient>
) : ReactiveOAuth2AuthorizedClientService {

override fun <T : OAuth2AuthorizedClient> loadAuthorizedClient(clientRegistrationId: String, principalName: String): Mono<T> {
Assert.hasText(clientRegistrationId, "clientRegistrationId cannot be empty")
Assert.hasText(principalName, "principalName cannot be empty")
return clientRegistrationRepository.findByRegistrationId(clientRegistrationId)
.map { rediskey(clientRegistrationId, principalName) }
.flatMap { key: String ->
reactiveOauthRedisTemplate.opsForValue().get(key) as Mono<T>
}
}
override fun saveAuthorizedClient(authorizedClient: OAuth2AuthorizedClient, principal: Authentication): Mono<Void> {
val key = rediskey(authorizedClient.clientRegistration.registrationId, principal.name)
reactiveOauthRedisTemplate.opsForValue().set(key, authorizedClient)
.let {
val x = reactiveOauthRedisTemplate.opsForValue().get(key)
println("my redis data is $x")
x.map {
println("my data value is $it")
val token = x as OAuth2AuthorizedClient
}
}
return Mono.empty()
}
private fun rediskey(clientRegistrationId: String, principalName: String): String {
return "something..."
}
}

这是我的redis配置

@Configuration
class RedisConfig {
@Bean
fun reactiveOauthRedisTemplate(reactiveRedisConnectionFactory: ReactiveRedisConnectionFactory,
resourceLoader: ResourceLoader): ReactiveRedisTemplate<String, OAuth2AuthorizedClient> {
val keySerializer: RedisSerializer<String> = StringRedisSerializer()
val defaultSerializer = JdkSerializationRedisSerializer(resourceLoader.classLoader)
val serializationContext = RedisSerializationContext
.newSerializationContext<String, OAuth2AuthorizedClient>(defaultSerializer).key(keySerializer).hashKey(keySerializer)
.build()
return ReactiveRedisTemplate(reactiveRedisConnectionFactory, serializationContext)
}
}

redis yaml配置

spring:
redis:
host: localhost

通过调试器,redis连接具有正确的主机和端口。感谢您的帮助。

这是来自调试器的redis客户端对象

redisURI = {RedisURI@12018} "redis://127.0.0.1"
host = "127.0.0.1"
socket = null
sentinelMasterId = null
port = 6379
database = 0
clientName = null
username = null
password = null
ssl = false
verifyMode = {SslVerifyMode@12033} "FULL"
startTls = false
timeout = {Duration@12010} "PT1M"
sentinels = {ArrayList@12034}  size = 0

react client的用法不正确,不应该从saveAuthorizedClient返回Mono.empty(),应该返回Mono<Boolean>并订阅它。如果不需要结果,可以忽略返回值,但必须订阅它,这样它才能执行业务逻辑。

最新更新