java - ArangoDB 和 velocypack,使用不可变类作为 dto
问题描述
我开始使用 ArangoDB 作为现有 java SpringBoot(和 SpringData)应用程序的持久层。有许多 DTO,它们都是不可变的类(使用 AutoValue)。
因此,没有默认构造函数,并且 arango 无法实例化 dto 以便从数据库中填充它。
是否可以让 arango spring 数据层使用 Builder 作为实例化和填充类的方式(即在反序列化期间)
从 json 解压缩时可以让 jackson 使用 dto 的构建器,因此作为后备选项,是否可以将 arango/java/springdata 配置为使用 jackson/json 而不是 velocypack?
谢谢,西蒙
更新1
感谢你及时的答复。我面临的一个复杂问题是自动值,如果有构建器,生成的构造函数将是私有的。我可以取出生成的构建器,并将获得一个包保护的构造函数,但是我也看到了这个......
com.arangodb.ArangoDBException: com.arangodb.velocypack.exception.VPackParserException: java.lang.InstantiationException: com.arangodb.springframework.core.convert.DBEntity
at com.arangodb.internal.util.ArangoDeserializerImpl.deserialize(ArangoDeserializerImpl.java:59) ~[arangodb-java-driver-4.4.0.jar:na]
at com.arangodb.internal.util.ArangoUtilImpl.deserialize(ArangoUtilImpl.java:92) ~[arangodb-java-driver-4.4.0.jar:na]
at com.arangodb.internal.ArangoExecutor.deserialize(ArangoExecutor.java:120) ~[arangodb-java-driver-4.4.0.jar:na]
.....
Caused by: com.arangodb.velocypack.exception.VPackParserException: java.lang.InstantiationException: com.arangodb.springframework.core.convert.DBEntity
at com.arangodb.velocypack.VPack.deserialize(VPack.java:398) ~[velocypack-1.1.0.jar:na]
at com.arangodb.internal.util.ArangoDeserializerImpl.deserialize(ArangoDeserializerImpl.java:55) ~[arangodb-java-driver-4.4.0.jar:na]
... 128 common frames omitted
Caused by: java.lang.InstantiationException: com.arangodb.springframework.core.convert.DBEntity
at java.lang.Class.newInstance(Class.java:427) ~[na:1.8.0_171]
at com.arangodb.velocypack.VPack.createInstance(VPack.java:488) ~[velocypack-1.1.0.jar:na]
at com.arangodb.velocypack.VPack.deserializeObject(VPack.java:450) ~[velocypack-1.1.0.jar:na]
at com.arangodb.velocypack.VPack.getValue(VPack.java:569) ~[velocypack-1.1.0.jar:na]
at com.arangodb.velocypack.VPack.deserialize(VPack.java:396) ~[velocypack-1.1.0.jar:na]
... 129 common frames omitted
Caused by: java.lang.NoSuchMethodException: com.arangodb.springframework.core.convert.DBEntity.<init>()
at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_171]
at java.lang.Class.newInstance(Class.java:412) ~[na:1.8.0_171]
... 133 common frames omitted
更新2
所以......原来有两个不同的问题,并且arango sping数据实现实际上都没有问题(这对我来说似乎很好,比我看到的类似混合模型文档/图形数据库更好)首先,返工自动值类不使用生成的构建器,意味着生成的类受包保护,并且效果很好,这要感谢@Christian。
第二个是 - 我将提出一个不同的问题 - 关注使用 spring (crudrepo) 'save' 来保存新文档,但也提供用户生成的 id。这是与解组到不可变对象不同的问题,因此我将为此提出一个新问题。
解决方案
您可以生成一个构造函数(甚至可以是包保护的),它采用 DTO 的所有参数(使用您的 IDE 或 Lombok)。如果这不是 DTO 中唯一的构造函数,请使用@PersistenceConstructor
.
更新: 您的 DTO 类是抽象的,您是否将它们传递给 Spring Data ArangoDB?如果是,这可能是您获得异常的原因。您应该传递生成的具体类。
推荐阅读
- javascript - 如何使用对象内的对象制作排行榜?Javascript
- angular - 组件之间无法通信事件
- flutter - Flutter 应用程序中我的文本小部件内部的额外间距
- javascript - 如何获取用户点击的按钮的id?
- r - Stata vs. R:Delta 方法为 logit 模型的相对风险 SE 提供了不同的结果
- android - 当我切换到暗模式时,我的应用程序崩溃了
- javascript - 具有相同 ID 的未选中输入复选框
- python - CondaMemoryError:conda 进程内存不足
- pycharm - 显示错误:“selenium.common.exceptions.WebDriverException:原始错误:重新安装需要'app'选项”
- scala - Spark 的 persist() 导致单个节点上的数据加载