RedisTemplate 序列化成功,反序列化失敗List, Set, Map失敗
- 異常信息
- RedisTemplate配置
- 異常原因
- 錯誤代碼示例
- 解決方法
序列化成功,反序列化失敗
異常信息
Caused by: com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve type id '6' as a subtype of `java.lang.Object`: no such class foundat [Source: (byte[])"[6,7,1,2,3,4,5]"; line: 1, column: 4]
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected VALUE_STRING: need String, Number of Boolean value that contains type id (for subtype of java.lang.Object)at [Source: (byte[])"[
RedisTemplate配置
首先確定RedisTemplate序列化器設置正確
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);//String的序列化方式// 使用GenericJackson2JsonRedisSerializer 替換默認序列化(默認采用的是JDK序列化)//序列號key valueredisTemplate.setKeySerializer(RedisSerializer.string());redisTemplate.setValueSerializer(RedisSerializer.json());redisTemplate.setHashKeySerializer(RedisSerializer.string());redisTemplate.setHashValueSerializer(RedisSerializer.json());redisTemplate.afterPropertiesSet();return redisTemplate;}
異常原因
使用了List.of(), Set.of(), Map.of()等方法導致序列化時沒有類型
使用stream api 的 toList 方法
錯誤代碼示例
Map<String, List<Integer>> map = new HashMap<>();Map<Integer, Integer> map2 = Map.of(1, 2, 3, 4);List<Integer> list = List.of(1, 2, 34, 54, 5);ArrayList<Integer> arrayList = new ArrayList<>(list);map.put("1", list);redisTemplate.opsForHash().putAll("test:1", map);redisTemplate.opsForHash().put("test:2", "1", arrayList);Set<Integer> nums = Set.of(1, 2, 3, 4, 5, 6, 7);redisTemplate.opsForValue().set("test:3", nums);
這是錯誤的序列化,會導致反序列化失敗
正確的序列化的帶有java類型的
解決方法
不使用List.of()
, Set.of()
, Map.of()
等靜態方法
使用.collect(Collectors.toList())
代替stream().toList()