经过一些研究,现在已解决。
- 将spring-data-redis更改为1.4.2。
- 使用带有缓存映射的类将RedisCacheManager扩展到序列化器(cacheName-> serializer)并缓存名称
- 覆盖getCache方法(Cache getCache(字符串名称)),并基于缓存名称,在redis模板中设置序列化程序名称
- 使用您的自定义缓存管理器
范例-
public class CustomRedisCacheManager extends RedisCacheManager{ public static final String CACHE_NAME_DEFAULT = "default"; public static final String CACHE_NAME_COUNTRY = "country"; public static final String CACHE_NAME_DESTINATIONS = "destinations"; private Map<String, RedisCache> redisCaches = new HashMap<>(); public CustomRedisCacheManager(Map<String, RedisTemplate> redisTemplates) { super(redisTemplates.get(CACHE_NAME_DEFAULT), redisTemplates.keySet()); redisTemplates.keySet().stream().forEach(cacheName -> redisCaches.put(cacheName, new RedisCache(cacheName, null, redisTemplates.get(cacheName), 0))); } @Override public Cache getCache(String cacheName) { return redisCaches.get(cacheName); }}@Configuration@EnableCachingpublic class RedisConfiguration extends CachingConfigurerSupport{ @Bean public JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setHostName(redisHostName); factory.setPort(redisPort); factory.setTimeout(100); return factory; } @Bean public CacheManager cacheManager() { Map<String, RedisTemplate> templates = new HashMap<>(); templates.put(CACHE_NAME_DEFAULT, getDefaultRedisTemplate()); templates.put(CACHE_NAME_COUNTRY, getmetadataRedisTemplate()); templates.put(CACHE_NAME_DESTINATIONS, getDestinationsRedisTemplate()); SabreRedisCacheManager sabreRedisCacheManager = new SabreRedisCacheManager(templates); return sabreRedisCacheManager; } @Bean public RedisTemplate<Object, Object> getDefaultRedisTemplate() { return getbaseRedisTemplate(); } @Bean public RedisTemplate<Object, Object> getCountryRedisTemplate() { RedisTemplate<Object, Object> redisTemplate = getbaseRedisTemplate(); redisTemplate.setValueSerializer(jsonRedisSerializer(Country.class)); return redisTemplate; } @Beanpublic RedisTemplate<Object, Object> getDestinationsRedisTemplate(){ RedisTemplate<Object, Object> redisTemplate = getbaseRedisTemplate(); redisTemplate.setValueSerializer(jsonRedisSerializer(TypeFactory.defaultInstance().constructCollectionType(List.class, Destination.class))); return redisTemplate;}private RedisTemplate<Object, Object> getbaseRedisTemplate(){ RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(jedisConnectionFactory()); redisTemplate.setKeySerializer(stringRedisSerializer()); redisTemplate.setHashKeySerializer(stringRedisSerializer()); redisTemplate.setValueSerializer(jsonRedisSerializer(Object.class)); return redisTemplate;}private Jackson2JsonRedisSerializer jsonRedisSerializer(Class type){ return jsonRedisSerializer(TypeFactory.defaultInstance().constructType(type));}private Jackson2JsonRedisSerializer jsonRedisSerializer(JavaType javaType){ Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(javaType); jackson2JsonRedisSerializer.setObjectMapper(new JsonObjectMapper()); return jackson2JsonRedisSerializer;}}


