java - 响应式(Reactive) Redis 序列化问题。无法序列化类型类 java.lang.Integer 的值,而不在 Redis 中保存时生成序列化器错误

标签 java spring-boot redis spring-data-redis

我试图在 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/

相关文章:

java - 优化 arrayRotateLeft 方法

java - 在 IDE 中突出显示否定运算符

java - 双 if 语句

java - 如何指定嵌套属性的默认值?

php - 使用带密码的 Redis 和 Laravel

java - 如何使我的哈希表适用于特定类型

spring - 在 Spock 规范中注入(inject)时,WebApplicationContext 不会 Autowiring

mysql - admin 不以一对一关系保存在用户表中 spring boot

python - 如何 : Redis in production server

websocket - Redis 与 dynamoDb 地理位置跟踪