【问题标题】:Attempted duplicate class definition exception when inserting data class to MongoDB将数据类插入 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。你知道出了什么问题吗?提前致谢。

【问题讨论】:

标签: spring mongodb spring-boot kotlin spring-data


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多