关于一个final关键字的坑

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删掉,代码就完美不报错了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值