如何注册自定义架构并使其在Corda中可查询?

时间:2018-02-01 18:56:45

标签: corda

相关问题(这对我没有帮助解决问题):

How to create custom schema with Corda Vault Extension

Error While Fetching Data from Corda Custom Tables

和其他一些人:https://stackoverflow.com/search?q=%5Bcorda%5D+custom+schema

我遇到了与自定义架构注册相关的错误(我认为)。运行带有状态模式中字段条件的VaultQuery时,出现以下异常:

  

org.hibernate.InstantiationException:没有实体的默认构造函数:: com.template.schema.SharedItemSchemaV1 $ PersistentSharedItem

如果我添加默认构造函数,那么:

  

vault.NodeVaultService._queryBy - org.hibernate.InstantiationException:无法实例化实体:: com.template.schema.SharedItemSchemaV1 $ PersistentSharedItem

项目在这里:https://github.com/tradle/sharing-cordapp

如果您运行Flow Tests,它们应该通过。如果你替换这一行 (https://github.com/tradle/sharing-cordapp/blob/master/cordapp/src/main/java/com/template/ResolveToIdentityFlow.java#L87)使用下面的代码,然后重新运行Flow Tests,你会遇到我提到的异常。

  

QueryCriteria criteria = new VaultQueryCriteria(Vault.StateStatus.UNCONSUMED)             .and(新的VaultCustomQueryCriteria(tmpIdCriteria));

2 个答案:

答案 0 :(得分:1)

使用默认构造函数似乎存在问题,该构造函数为每个值传递null。使用以下代替我工作:

public PersistentSharedItem() {
    this("", "", "", "", 0L, UUID.randomUUID());
}

此外,在使用自定义保管库查询时,您必须始终引用实体属性而不是状态属性,因为所有查询都使用已注册并可与我们的NodeSchemaService一起使用的Hibernate实体。所以不要这样做:

linkField = SharedItemState.class.getDeclaredField("link");

您需要这样做:

linkField = SharedItemSchemaV1.PersistentSharedItem.class.getDeclaredField("link");

如果要在流测试中使用模式,还需要在每个模拟节点上注册自定义模式:

for (StartedNode<MockNetwork.MockNode> node : nodes.getPartyNodes()) {
    node.getInternals().registerCustomSchemas(
        ImmutableSet.of(new SharedItemSchemaV1())
    );
}

将来,自定义模式的注册很可能会自动化。

答案 1 :(得分:0)

在从节点的外壳进行流存储时,我遇到了类似的问题。错误消息是

“ [[节点线程1] vault.NodeVaultService._queryBy- 请注册实体“ com.template.IState” 有关更多信息,请参见https://docs.corda.net/api-persistance.html#custom-schema-registration {}“

我已经为状态创建了一个架构,但是正在使用状态类

Field iValue = IState.class.getDeclaredField("IValue");

将其更改为架构持久性类可以实现以下目的:

Field iValue = ISchemaV1.PersistentI.class.getDeclaredField("IValue");