相关问题(这对我没有帮助解决问题):
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));
答案 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");