关于mongoDB的upsert方法属性不一致报错记录
使用mongoDB添加诗句的时候出现Exception in thread “main” java.lang.IllegalAccessError: tried to access class org.springframework.beans.PropertyMatc错误。
查询了大量文章,跑了源码发现mongodb的upsert方法有一个更新和插入的操作。
先进行进行查询操作。在进行插入操作。然后就会发生如下错误:
org.springframework.data.mongodb.core.convert.QueryMapper#getMappedObject(org.bson.conversions.Bson, org.springframework.data.mongodb.core.mapping.MongoPersistentEntity<?>)方法就是直接用来映射对象的,在这个方法中的代码Field field = createPropertyField(entity, key, mappingContext);是用来构建字段的映射关系。
最终会指向org.springframework.data.mongodb.core.convert.QueryMapper.MetadataBackedField#getPath(java.lang.String)这个方法中出问题的就是PropertyPath path = PropertyPath.from(pathExpression.replaceAll("\.\d+", “”), entity.getTypeInformation());这行代码又会调用org.springframework.data.mapping.PropertyPath#from(java.lang.String, org.springframework.data.util.TypeInformation<?>)
当我们字段别名映射不上时,报错。
还有,因为我项目之前是分布式的,由于需求改为单点项目。架构的各种包的版本不一致。我的这个是由于spring-data-mongo的其中的spring-commons的jar包版本冲突导致。这个包中含有upsert方法的getTypeInformation的定义。而我使用的11.1的版本和冲突的11.3的版本中,11.3没有这个方法。是因为在spring4.2.0之后的mongo增加了大量的自动配置功能,具体的就问度娘。所以不存在这个方法,从而找不到属性配置,而报错。找到原因直接解决冲突。搞定。现在已经是凌晨了,没时间上图了,恢复bug也要时间,就这样简单的记录下。以防忘记。
还有许多是jar冲突引起的各种错误,以后碰到这种进入源码的报错第一时间警惕,
第一:属性传值有误,
第二:jar包冲突,
第三:版本不兼容。
睡觉…