ArangoDB和velocypack,使用不可变类作为dtos

时间:2018-06-09 02:34:13

标签: java spring-data immutability builder arangodb

我开始使用ArangoDB作为现有java SpringBoot(和SpringData)应用程序的持久层。 有许多DTO,所有这些都是不可变类(使用AutoValue)。

因此,没有默认构造函数,并且arango无法实例化dto以便从数据库中填充它。

是否可以让arango spring数据层使用Builder作为实例化和填充类的方法(即在反序列化期间)

当从json中解放时,jackson可以使用dto的构建器,因此作为后备选项,是否可以配置arango / java / springdata以使用jackson / json而不是velocypack?

谢谢, 西蒙

update1

感谢您的快速回答。我面临的一个复杂问题是autovalue,如果有一个构建器,生成的构造函数将是私有的。我可以取出生成的构建器,并获得一个包保护的构造函数,但是我也看到了这个...

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

UPDATE2

所以...结果有2个不同的问题,而且实际上都没有arango sping数据实现的问题(这对我来说似乎不错,比我在类似的混合模型文档/图形DB中看到的更好) 首先,将自动值类重新编译为而不是使用生成的构建器,意味着生成的类是包被保护的,并且这很有效,感谢@Christian。

第二个是 - 我将采用另一个问题 - 关注使用spring(crudrepo)'save'来保存新文档,还提供用户生成的id。这是从解组到不可变对象的另一个问题,因此我将为此开始一个新问题。

1 个答案:

答案 0 :(得分:2)

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

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