将 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; }
我在使用 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; }