1.redis自定义序列化
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
//ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构
ObjectMapper objectMapper = new ObjectMapper();
//配置全局序列化参数
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
以上是序列化的代码片段,整体运行都完全没有问题。
存入到redis的hash中的,结果显示如下
9) "d6158c827943"
10) "[\"com.wk.hx.po.TerminalWithFencePo\",{\"tmId\":7,\"tmMac\":\"D6158C827943\",\"gwMac\":null,\"tmUserName\":\"\xe4\x
b8\x98\xe5\x8d\xab\xe5\x86\xb0\",\"tmUserGender\":0,\"tmUserAge\":25,\"tmUserStature\":16.0,\"tmUserWeight\":60.0,\"fenc
es\":null}]"
重点;
关于在TerminalWithFencePo实体类上加上final修饰,就会报如下错误:
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected START_ARRAY: need JSON Array to contain As.WRAPPER_ARRAY type information for class java.lang.Object
网上查询提示,注释掉一行:
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
跟着提示走下,结果还是报错,报:
org.springframework.data.redis.serializer.SerializationException: Could not read JSON: Missing type id when trying to resolve subtype of [simple type, class java.lang.Object]: missing type id property '@class'
最后无休止的找错下来,结果可想而知,拆东墙补西墙;最后回到我们注释掉的那一行代码上来,会发现有趣的bug;
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
// om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
看到此处,回过去看代码,就发现多了一个final修饰,把final删掉,代码就完美不报错了