我使用的是 neo4j ogm 版本 4.0.10。 我正在尝试使用 Kotlin(没有 Spring)保存 @NodeEntity 对象,但我得到了 IllegalArgumentException。
我在项目中配置了无参数插件。
我的节点类看起来像这样
package pl.bfelis.rpg.nodes
/// IMPORTS
@Serializable
@NodeEntity
data class CampaignNode(
@Index
var uid: String,
var name: String
) {
@Id
@GeneratedValue
var id: String? = null
}
我正在使用正确的包创建 SessionFactory:
fun getNeo4j(config: Neo4jConfig): SessionFactory {
val configuration: Configuration = Configuration.Builder()
.uri(config.url)
.credentials(config.user, config.password)
.build()
return SessionFactory(configuration, "pl.bfelis.rpg.nodes")
}
但是,当尝试保存此类对象时,我遇到了这样的异常 -
java.lang.IllegalArgumentException: Can not get java.lang.String field pl.bfelis.rpg.nodes.CampaignNode.id on pl.bfelis.rpg.nodes.CampaignNode
堆栈跟踪:
java.lang.IllegalArgumentException: Can not get java.lang.String field pl.bfelis.rpg.nodes.CampaignNode.id on pl.bfelis.rpg.nodes.CampaignNode
at java.base/jdk.internal.reflect.MethodHandleFieldAccessorImpl.newGetIllegalArgumentException(MethodHandleFieldAccessorImpl.java:86)
at java.base/jdk.internal.reflect.MethodHandleObjectFieldAccessorImpl.get(MethodHandleObjectFieldAccessorImpl.java:61)
at java.base/java.lang.reflect.Field.get(Field.java:444)
at org.neo4j.ogm.metadata.FieldInfo.read(FieldInfo.java:430)
at org.neo4j.ogm.metadata.FieldInfo.readProperty(FieldInfo.java:488)
at org.neo4j.ogm.utils.EntityUtils.identity(EntityUtils.java:57)
at org.neo4j.ogm.context.MappingContext.nativeId(MappingContext.java:552)
at org.neo4j.ogm.cypher.compiler.CypherContext.getIdentity(CypherContext.java:66)
at org.neo4j.ogm.cypher.compiler.CypherContext.visitedNode(CypherContext.java:90)
at org.neo4j.ogm.context.EntityGraphMapper.mapEntity(EntityGraphMapper.java:267)
at org.neo4j.ogm.context.EntityGraphMapper.map(EntityGraphMapper.java:170)
at org.neo4j.ogm.session.delegates.SaveDelegate.lambda$save$1(SaveDelegate.java:89)
at java.base/java.util.Collections$SingletonList.forEach(Collections.java:5186)
at org.neo4j.ogm.session.delegates.SaveDelegate.save(SaveDelegate.java:89)
at org.neo4j.ogm.session.delegates.SaveDelegate.save(SaveDelegate.java:51)
at org.neo4j.ogm.session.Neo4jSession.save(Neo4jSession.java:490)
at pl.bfelis.rpg.domain.campaign.CampaignService.createCampaign(CampaignService.kt:33)
at pl.bfelis.rpg.domain.campaign.CampaingRoutesKt$campaignRoutes$1$1.invokeSuspend(CampaingRoutes.kt:33)
at pl.bfelis.rpg.domain.campaign.CampaingRoutesKt$campaignRoutes$1$1.invoke(CampaingRoutes.kt)
at pl.bfelis.rpg.domain.campaign.CampaingRoutesKt$campaignRoutes$1$1.invoke(CampaingRoutes.kt)
at io.ktor.server.resources.RoutingKt$handle$2.invokeSuspend(Routing.kt:265)
at io.ktor.server.resources.RoutingKt$handle$2.invoke(Routing.kt)
at io.ktor.server.resources.RoutingKt$handle$2.invoke(Routing.kt)
at io.ktor.server.routing.Route$buildPipeline$1$1.invokeSuspend(Route.kt:116)
at io.ktor.server.routing.Route$buildPipeline$1$1.invoke(Route.kt)
at io.ktor.server.routing.Route$buildPipeline$1$1.invoke(Route.kt)
at io.ktor.util.pipeline.DebugPipelineContext.proceedLoop(DebugPipelineContext.kt:80)
at io.ktor.util.pipeline.DebugPipelineContext.access$proceedLoop(DebugPipelineContext.kt:16)
at io.ktor.util.pipeline.DebugPipelineContext$proceedLoop$1.invokeSuspend(DebugPipelineContext.kt)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:173)
at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:166)
at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:569)
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:994)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.ktor.server.netty.EventLoopGroupProxy$Companion.create$lambda$1$lambda$0(NettyApplicationEngine.kt:296)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:1583)
请尝试将
id
移动到主构造函数中,如下所示:
@NodeEntity
data class CampaignNode(
@Id
@GeneratedValue
var id: String? = null,
@Index
var uid: String,
var name: String
)