将 StringRedisSerializer 用于 HashValueSerializer 时不能存储非字符串对象

can NOT store non-string Object when using StringRedisSerializer for HashValueSerializer

我在使用 StringRedisSerializer 存储哈希值时遇到了 ClassCastException 异常。如果去掉非字符串字段'age',则可以存储到redis中。

    Demo demo = new Demo();
    demo.setName("DemoCache_jsonSerializer");
    // non-string field
    demo.setAge(111);



    // set stringSerializer
    redisTemplate.setHashValueSerializer(new StringRedisSerializer());
    //exception here: java.lang.Integer cannot be cast to java.lang.String
    redisTemplate.opsForHash().putAll("testKey",
            mapper.toHash(demo));

我知道如果我改成 jsonserializer 它会起作用,但我的问题是 如何让它与 StringRedisSerializer 一起工作,并能够存储具有非字符串字段的对象

使用 StringRedisSerializer 只能将 String 转换为 byte[],将 byte[] 转换为 String。 为了让它与 StringRedisSerializer 一起工作,最好将所有对象转换为 String 或覆盖 toString()。但我想这可能是一个糟糕的设计。

查看以下链接:Source Code and Documentation您可能会发现一些有用的东西。

   @Bean
public RedisTemplate<String, Object> redisTemplate() {
    final RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
    template.setConnectionFactory(jedisConnectionFactory());
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
    template.afterPropertiesSet();
    return template; }