首页 新闻 搜索 专区 学院

项目中用到spring管理redis缓存,配置好后只能缓存String类型数据

0
悬赏园豆:20 [已解决问题] 解决于 2017-05-09 22:10

如截图所示,如果要缓存的数据是String类型,能正常放进去

 

但是如果是个非String类型,比方说是个List类型,它就会报错,java.util.List cannot be cast to java.lang.String

debug了一下是在org.springframework.cache.interceptor.AbstractCacheInvoker里的doPut方法里报的RunTimeException,如图

 这个类型转换不成功,是哪里配置不对么?实在找不出来具体的报错地方是哪里,有人知道的请帮忙看看。。。。

问题补充:

那啥快看的主页 那啥快看 | 初学一级 | 园豆:151
提问于:2017-05-09 17:25
< >
分享
最佳答案
0

你的key和value都要序列化的 像stringSerializer和 valueSerializer之类的

收获园豆:12
让我发会呆 | 老鸟四级 |园豆:2636 | 2017-05-09 17:41

怎么操作,我这边应该不是key的问题,就是value如果不是String就不行。

那啥快看 | 园豆:151 (初学一级) | 2017-05-09 17:48

@那啥快看: 

public void save(final String key, final Serializable object, final long expireTime) {
// TODO Auto-generated method stub
try {
redisTemplate.execute(new RedisCallback<Serializable>() {
@Override
public Serializable doInRedis(RedisConnection connection) throws DataAccessException {
try {
@SuppressWarnings("unchecked")
RedisSerializer<Serializable> valueSerializer = (RedisSerializer<Serializable>) redisTemplate.getValueSerializer();
connection.set(redisTemplate.getStringSerializer().serialize(key), valueSerializer.serialize(object));
connection.expire(redisTemplate.getStringSerializer().serialize(key), expireTime);
} catch (Exception e) {
throw e;
}
return null;
}
});
} catch (Exception e) {
throw e;
}
}

这是我项目的redis save方法,object是实现了Serializable的一个自定义的DTO,你参考一下吧

让我发会呆 | 园豆:2636 (老鸟四级) | 2017-05-09 17:53

@让我发会呆: 谢谢,你的代码给了我提示,其实我网上之前我找的帖子人家已经写了怎么操作了,只怪我自己看的不仔细

那啥快看 | 园豆:151 (初学一级) | 2017-05-09 22:05
其他回答(2)
0

先json序列化了再放进去.

收获园豆:8
吴瑞祥 | 园豆:28841 (高人七级) | 2017-05-09 17:31

 转化为json字符串是可以放进去,但是项目中大多数情况都是要缓存实体bean的,而且我看网上别人可以缓存,所以我要知道问题的答案

支持(0) 反对(0) 那啥快看 | 园豆:151 (初学一级) | 2017-05-09 17:35

@那啥快看: 也是序列化的.不过是序列化的方式不一样.

支持(0) 反对(0) 吴瑞祥 | 园豆:28841 (高人七级) | 2017-05-09 17:38

@吴瑞祥: 你说的是对的,已经解决了

支持(0) 反对(0) 那啥快看 | 园豆:151 (初学一级) | 2017-05-09 22:04
0

问题已经解决,还是我上面截图的RedisCacheConfig那个类,里面的redisTemplate这里就不在applicationContext.xml里配置了,在这个类里加上RedisSerializer的json序列化代码

  1.     @Bean  
  2.     public RedisTemplate<String, String> redisTemplate(  
  3.             RedisConnectionFactory factory) {  
  4.         StringRedisTemplate template = new StringRedisTemplate(factory);  
  5.         Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);  
  6.         ObjectMapper om = new ObjectMapper();  
  7.         om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);  
  8.         om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);  
  9.         jackson2JsonRedisSerializer.setObjectMapper(om);  
  10.         template.setValueSerializer(jackson2JsonRedisSerializer);  
  11.         template.afterPropertiesSet();  
  12.         return template;  
  13.     } 
那啥快看 | 园豆:151 (初学一级) | 2017-05-09 22:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册