将数据类插入 MongoDB 时尝试重复类定义异常

Posted

技术标签:

【中文标题】将数据类插入 MongoDB 时尝试重复类定义异常【英文标题】:Attempted duplicate class definition exception when inserting data class to MongoDB 【发布时间】:2020-07-16 13:37:12 【问题描述】:

我正在计划任务中插入一些 Spring Data 文档,如下所示:

val session = client.startSession()
val template = MongoTemplate(client, db)
val sessionBoundOps = template.withSession(session)
session.startTransaction()
sessionBoundOps.insert(obj);
session.commitTransaction()

这会导致以下异常:

Unexpected error occurred in scheduled task
java.lang.RuntimeException: java.lang.IllegalStateException: org.springframework.cglib.core.CodeGenerationException: java.lang.LinkageError-->loader org.springframework.boot.loader.LaunchedURLClassLoader @5d3411d attempted duplicate class definition for pw.prj.core.domain.stats.UserDailyStats_Accessor_wvhcc8. (pw.prj.core.domain.stats.UserDailyStats_Accessor_wvhcc8 is in unnamed module of loader org.springframework.boot.loader.LaunchedURLClassLoader @5d3411d, parent loader 'app')
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.createAccessorClass(ClassGeneratingPropertyAccessorFactory.java:200)
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.potentiallyCreateAndRegisterPersistentPropertyAccessorClass(ClassGeneratingPropertyAccessorFactory.java:184)
    at org.springframework.data.mapping.model.ClassGeneratingPropertyAccessorFactory.getPropertyAccessor(ClassGeneratingPropertyAccessorFactory.java:92)
    at org.springframework.data.mapping.model.BasicPersistentEntity.getPropertyAccessor(BasicPersistentEntity.java:455)
    at org.springframework.data.mapping.model.IdPropertyIdentifierAccessor.<init>(IdPropertyIdentifierAccessor.java:54)
    at org.springframework.data.mapping.model.BasicPersistentEntity.getIdentifierAccessor(BasicPersistentEntity.java:471)
    at org.springframework.data.mongodb.core.EntityOperations$AdaptibleMappedEntity.of(EntityOperations.java:619)
    at org.springframework.data.mongodb.core.EntityOperations$AdaptibleMappedEntity.access$100(EntityOperations.java:598)
    at org.springframework.data.mongodb.core.EntityOperations.forEntity(EntityOperations.java:104)
    at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:1244)
    at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:1185)
    at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:1170)
    at pw.prj.core.infra.persistence.MongoUserDailyStatsPersister$saveStatsAndTransferMoney$1.invoke(MongoUserDailyStatsPersister.kt:44)
    at pw.prj.core.infra.persistence.MongoUserDailyStatsPersister$saveStatsAndTransferMoney$1.invoke(MongoUserDailyStatsPersister.kt:18)
    at pw.prj.core.infra.TransactionRunner.run(TransactionRunner.kt:20)
    ...

我的模型是简单的数据类,如下所示:

@Document
@CompoundIndexes(value = [
    CompoundIndex(def = "'userId': 1, 'date': 1", unique = true)
])
data class UserDailyStats(
    val userId: ObjectId,
    val date: Date,

    val viewsPerOwnServer: Map<String, Int>,
    val adViewsPerOwnServer: Map<String, Int>,
    val revenuePerOwnServer: Map<String, String>,

    val referralRegistrations: Int,
    val referralViews: Int,
    val referralAdViews: Int,
    val referralRevenue: String,

    @Id val id: String? = null
)

Java 12,Spring Boot 2.2.0.M5。你知道出了什么问题吗?提前致谢。

【问题讨论】:

可能与这个***.com/questions/38558290/…有关 【参考方案1】:

帮助我的是使用通用类而不是数据类。由于 Spring 对 final 属性的投诉,还将 id 字段类型更改为 var

更新:Spring Boot 2.2.6.RELEASE 也修复了这个问题,因此仍然可以在多连接 Spring 环境中为实体使用数据类。

【讨论】:

以上是关于将数据类插入 MongoDB 时尝试重复类定义异常的主要内容,如果未能解决你的问题,请参考以下文章

比较器类在排序时抛出 ClassCastException [重复]

为啥需要自定义异常类[重复]

类定义中的 Mongo _id

使用 mongoengine 将多文档插入到 mongodb

MongoDb c# .net Save 抛出重复键异常

临时表异常 - e11000 重复键错误