首页 > 解决方案 > 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。这是与解组到不可变对象不同的问题,因此我将为此提出一个新问题。

标签: javaspring-dataimmutabilitybuilderarangodb

解决方案


您可以生成一个构造函数(甚至可以是包保护的),它采用 DTO 的所有参数(使用您的 IDE 或 Lombok)。如果这不是 DTO 中唯一的构造函数,请使用@PersistenceConstructor.

更新: 您的 DTO 类是抽象的,您是否将它们传递给 Spring Data ArangoDB?如果是,这可能是您获得异常的原因。您应该传递生成的具体类。


推荐阅读