在为HashValueSerializer使用StringRedisSerializer时,不能存储非字符串对象

时间:2017-09-15 06:43:39

标签: redis jedis spring-data-redis

使用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一起使用,并能够存储具有非字符串字段的对象

2 个答案:

答案 0 :(得分:2)

使用StringRedisSerializer,您只能将String转换为byte[],将byte[]转换为String。 要使其与StringRedisSerializer一起使用,请将所有对象转换为String,以覆盖toString()。但我想这可能是一个糟糕的设计。

请查看以下链接:Source CodeDocumentation您可能会发现有用的内容。

答案 1 :(得分:0)

   @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; }