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()