我试图在 redis 中存储一个对象,但收到此错误。 reactor.core.Exceptions$ErrorCallbackNotImplemented:java.lang.IllegalStateException:在没有序列化器的情况下无法序列化类型类 java.lang.Integer 的值 我已经包含了值和哈希值的序列化器,但它不起作用。下面是我的代码
配置
public ReactiveRedisOperations<String, Player> playerRedisOperations(LettuceConnectionFactory connectionFactory) {
RedisSerializationContext<String, Player> serializationContext = RedisSerializationContext
.<String, Player>newSerializationContext(new StringRedisSerializer())
.key(new StringRedisSerializer())
.value(new GenericToStringSerializer<>(Player.class))
.hashKey(new StringRedisSerializer())
.hashValue(new GenericJackson2JsonRedisSerializer())
.build();
return new ReactiveRedisTemplate<>(connectionFactory, serializationContext);
}
redis 存储库
private final ReactiveRedisOperations<String, Player> redisOperations;
private final ReactiveHashOperations<String, Integer, Player> hashOperations;
public PlayerRedisRepositoryImpl(@Qualifier("playerRedisOperations")ReactiveRedisOperations<String, Player> redisOperations) {
this.redisOperations = redisOperations;
this.hashOperations = redisOperations.opsForHash();
}
public Mono<Player> savePlayer(String key,Player player) {
return hashOperations.put(key, player.user_id(), player).map(isSaved -> player);
}
堆栈跟踪
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalStateException: Cannot serialize value of type class java.lang.Integer without a serializer
Caused by: java.lang.IllegalStateException: Cannot serialize value of type class java.lang.Integer without a serializer
at org.springframework.data.redis.serializer.DefaultRedisElementWriter.write(DefaultRedisElementWriter.java:56)
at org.springframework.data.redis.serializer.RedisSerializationContext$SerializationPair.write(RedisSerializationContext.java:287)
at org.springframework.data.redis.core.DefaultReactiveHashOperations.rawHashKey(DefaultReactiveHashOperations.java:339)
at org.springframework.data.redis.core.DefaultReactiveHashOperations.lambda$put$20(DefaultReactiveHashOperations.java:251)
at org.springframework.data.redis.core.DefaultReactiveHashOperations.lambda$createMono$27(DefaultReactiveHashOperations.java:324)
at org.springframework.data.redis.core.ReactiveRedisTemplate.lambda$doInConnection$1(ReactiveRedisTemplate.java:244)
at reactor.core.publisher.FluxUsingWhen.deriveFluxFromResource(FluxUsingWhen.java:119)
可能是什么问题?
最佳答案
根本原因在于您的配置。 StringRedisSerializer() 需要 hashKey 的值,但您向其传递的是整数。 将 .hashKey(new StringRedisSerializer()) 替换为 .hashKey(new Jackson2JsonRedisSerializer<>(Integer.class))
正确的配置是:
public ReactiveRedisOperations<String, Player> playerRedisOperations(LettuceConnectionFactory connectionFactory) {
RedisSerializationContext<String, Player> serializationContext = RedisSerializationContext
.<String, Player>newSerializationContext(new StringRedisSerializer())
.key(new StringRedisSerializer())
.value(new GenericToStringSerializer<>(Player.class))
.hashKey(new Jackson2JsonRedisSerializer<>(Integer.class))
.hashValue(new GenericJackson2JsonRedisSerializer())
.build();
return new ReactiveRedisTemplate<>(connectionFactory, serializationContext);
}
关于java - 响应式(Reactive) Redis 序列化问题。无法序列化类型类 java.lang.Integer 的值,而不在 Redis 中保存时生成序列化器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71031313/