gpt4 book ai didi

java - 带有 Kotlin 数据类的 ArangoDB Java 驱动程序

转载 作者:行者123 更新时间:2023-11-29 06:50:13 28 4
gpt4 key购买 nike

好吧,Arongo DB Java 驱动程序在存储 Kotlin 数据类时没有问题,但它无法将它们加载回来。

展示:

import com.arangodb.ArangoCollection
import com.arangodb.ArangoDB
import com.arangodb.entity.DocumentCreateEntity

fun main(args: Array<String>) {
// Get or recreate collection: "some_collection" in DB "test_db"
val collection: ArangoCollection = with(ArangoDB.Builder().build()!!.db("test_db")) {
if (!exists()) create()
with(collection("some_colelction")) {
if (!exists()) create()
this
}
}

// POJO as Kotlin data class
data class Foo(
val topic: String,
val answer: Int
)

val result: DocumentCreateEntity<Foo> = collection.insertDocument(Foo("The ultimate answer", 42))

// reusult have a key of the new document
// And in ArangoDB Web Interface you can see this document: {"answer":42,"topic":"The ultimate answer"}
// http://localhost:8529/_db/test_db/_admin/aardvark/index.html#collection/some_colelction/documents/

// But it doesn't work backwards
val foo: Foo = collection.getDocument(result.key, Foo::class.java)
}

堆栈跟踪:

Exception in thread "main" com.arangodb.ArangoDBException: com.arangodb.velocypack.exception.VPackParserException: java.lang.InstantiationException: MainKt$main$Foo
at com.arangodb.internal.util.ArangoDeserializerImpl.deserialize(ArangoDeserializerImpl.java:59)
at com.arangodb.internal.util.ArangoUtilImpl.deserialize(ArangoUtilImpl.java:58)
at com.arangodb.internal.ArangoExecutor.createResult(ArangoExecutor.java:112)
at com.arangodb.internal.ArangoExecutorSync$1.deserialize(ArangoExecutorSync.java:56)
at com.arangodb.internal.ArangoExecutorSync.execute(ArangoExecutorSync.java:72)
at com.arangodb.internal.ArangoExecutorSync.execute(ArangoExecutorSync.java:53)
at com.arangodb.internal.ArangoExecutorSync.execute(ArangoExecutorSync.java:49)
at com.arangodb.internal.ArangoCollectionImpl.getDocument(ArangoCollectionImpl.java:134)
at com.arangodb.internal.ArangoCollectionImpl.getDocument(ArangoCollectionImpl.java:126)
at MainKt.main(main.kt:30)
Caused by: com.arangodb.velocypack.exception.VPackParserException: java.lang.InstantiationException: MainKt$main$Foo
at com.arangodb.velocypack.VPack.deserialize(VPack.java:398)
at com.arangodb.internal.util.ArangoDeserializerImpl.deserialize(ArangoDeserializerImpl.java:55)
... 9 more
Caused by: java.lang.InstantiationException: MainKt$main$Foo
at java.lang.Class.newInstance(Class.java:427)
at com.arangodb.velocypack.VPack.createInstance(VPack.java:488)
at com.arangodb.velocypack.VPack.deserializeObject(VPack.java:450)
at com.arangodb.velocypack.VPack.getValue(VPack.java:569)
at com.arangodb.velocypack.VPack.deserialize(VPack.java:396)
... 10 more
Caused by: java.lang.NoSuchMethodException: MainKt$main$Foo.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 14 more

Kotlin 的数据类很好地序列化为预期的 JSON 文档,但似乎 ArangoDB Java 驱动程序无法将它们加载回来。如果我将文档作为 BaseDocument 获取,我可以毫无问题地使用一些 JSON 库将其映射回我的数据类,但是加油!必须有更好的方法,否则我肯定错过了一些东西。

最佳答案

ArangoDB Java 驱动程序支持替代序列化程序来反序列化文档、边缘和查询结果。一种实现是 VelocyJack这是基于 jackson 与 jackson-dataformat-velocypack 的合作.

您应该能够配置它,它与 jackson-kotlin-module 一起工作.

VelocyJack velocyJack = new VelocyJack();
velocyJack.configure((mapper) -> {
mapper.registerModule(new KotlinModule())
});
ArangoDB arango = new ArangoDB.Builder().serializer(velocyJack).build();

关于java - 带有 Kotlin 数据类的 ArangoDB Java 驱动程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126054/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com