StringBoot @JsonIgnoreProperties生效源码追踪

问题来源

com.xxxx.common.domain.bean.content.TopicBean
但是实际上TopicBean中没有这么多字段。导致报错。可以通过给该bean增加注解
@JsonIgnoreProperties(ignoreUnknown = true)来消除该报错信息。现在通过追踪源码来查看报错位置以及该注解生效位置。

1.报错原因及报错信息

原因:json中指定了参数类型为com.xxxx.common.domain.bean.content.TopicBean,故反向序列化解析时会逐个字段匹配该bean,未匹配到某些字段并且未ignore时,会报错。

信息:Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field “pictureUrl” (class com.xxxx.common.domain.bean.content.TopicBean), not marked as ignorable (6 known properties: “endTime”, “id”, “userTypeStr”, “startTime”, “recommendFlag”, “name”])

2.Redis Key信息

key:topic
value:

[
  java.util.ArrayList,
  [
    [
      com.xxxx.common.domain.bean.content.TopicBean,
      {
        id: 30016,
        name: APPYY3527,
        pictureUrl: null,
        explain: null,
        explainPictureUrl: null,
        startTime: null,
        endTime: null,
        userTypeStr: null,
        recommendFlag: null
      }
    ]
  ]
]

3.过程还原如下:


redis配置:

org.springframework.data.redis.core.edisTemplate<K, V>
@Autowired
private RedisTemplate<String, Object> redisTemplate;

获取hash类型redis的数据,接收参数为Map<Object, Object>

redisTemplate.opsForHash().entries(key);

在这里插入图片描述
红框方法获取反序列化的值

DefaultHashOperations.entries(K key)

在这里插入图片描述
map的value反序列化

AbstractIoerations.deserializeHashMap(@Nullable Map<byte[], byte[]> entries) 

在这里插入图片描述
调用了Jackson2JsonRedisSerializer.deserialize

AbstractIoerations.deserializeHashValue(byte[] value)

给map塞值

Jackson2JsonRedisSerializer.deserialize(@Nullable byte[] bytes)

在这里插入图片描述
调用ObjectMapper._readMapAndClose

ObjectMapper.readValue(byte[] src, int offset, int len, JavaType valueType)

此时获取到类型为array,对array中的值进行反序列化

ObjectMapper._readMapAndClose(JsonParser p0, JavaType valueType)

在这里插入图片描述

TypeWrappedDeserializer.deserialize(JsonParser p, DeserializationContext ctxt, Object intoValue)

在这里插入图片描述
根据类型进行反序列化

CollectionDeserializer.deserializeWithType(JsonParser p, DeserializationContext ctxt, TypeDeserializer typeDeserializer)

在这里插入图片描述

AsArrayTypeDeserializer.deserializeTypedFromArray(JsonParser jp, DeserializationContext ctxt)

在这里插入图片描述

AsArrayTypeDeserializer._deserialize(JsonParser p, DeserializationContext ctxt)

在这里插入图片描述

BeanDeserializer.deserialize(JsonParser p, DeserializationContext ctxt)

在这里插入图片描述

BeanDeserializer.vanillaDeserialize(JsonParser p, DeserializationContext ctxt, JsonToken t)

在这里插入图片描述

BeanDeserializerBase.handleUnknownVanilla(JsonParser p, DeserializationContext ctxt, Object bean, String propName)

在这里插入图片描述
处理bean中未识别到的参数。发现bean中存在ignaeAllUnknow参数,跳过该字段。若不存在,继续回调

BeanDeserializerBase.handleUnknownProperty(JsonParser p, DeserializationContext ctxt, Object beanOrClass, String propName)

在这里插入图片描述
完。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值