问题来源
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)
完。