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

如何注册自定义模式并使其在Corda中可查询?,corda,Corda,相关问题(无法帮助我解决问题): 还有其他一些: 我遇到了一个与自定义模式注册相关的错误(我想)。当使用状态模式中字段的条件运行Vault查询时,我会遇到以下异常: org.hibernate.InstantiationException:实体::com.template.schema.SharedItemSchemaV1$PersistentSharedItem没有默认构造函数 如果我添加了一个默认构造函数,那么: vault.NodeVaultService.\u queryBy-org

相关问题(无法帮助我解决问题):

还有其他一些:

我遇到了一个与自定义模式注册相关的错误(我想)。当使用状态模式中字段的条件运行Vault查询时,我会遇到以下异常:

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

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

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

项目在这里:

如果运行流测试,它们应该通过。如果你换这条线 ()使用下面的代码,并重新运行流测试,您将遇到我提到的异常

QueryCriteria条件=新Vault QueryCriteria(Vault.StateStatus.Unused) .和(新的客户查询标准(tmpIdCriteria))


使用默认构造函数(为每个值传递
null
)似乎存在问题。相反,使用以下方法对我有效:

public PersistentSharedItem() {
    this("", "", "", "", 0L, UUID.randomUUID());
}
此外,在使用自定义vault查询时,必须始终引用实体属性而不是状态属性,因为所有查询都使用Hibernate实体,这些实体已在我们的
NodeSchemaService
中注册并可用。因此,不要这样做:

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())
    );
}
for(StartedNode:nodes.getPartyNodes()){
node.getInternals().registerCustomSchemas(
ImmutableSet.of(新的SharedItemSchemaV1())
);
}

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

使用默认构造函数(为每个值传递
null
)似乎存在问题。相反,使用以下方法对我有效:

public PersistentSharedItem() {
    this("", "", "", "", 0L, UUID.randomUUID());
}
此外,在使用自定义vault查询时,必须始终引用实体属性而不是状态属性,因为所有查询都使用Hibernate实体,这些实体已在我们的
NodeSchemaService
中注册并可用。因此,不要这样做:

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())
    );
}
for(StartedNode:nodes.getPartyNodes()){
node.getInternals().registerCustomSchemas(
ImmutableSet.of(新的SharedItemSchemaV1())
);
}

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

在节点外壳的流中执行vault时,我遇到了类似的问题。错误消息是错误的

“[Node thread-1]vault.NodeAuditService.\u查询方式- 请注册实体“com.template.IState” 有关详细信息,请参见{}”

我已经为我的状态创建了一个模式,但正在使用state类

Field iValue = IState.class.getDeclaredField("IValue");
将其更改为模式持久性类实现了以下目的:

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

在节点外壳的流中执行vault时,我遇到了类似的问题。错误消息是错误的

“[Node thread-1]vault.NodeAuditService.\u查询方式- 请注册实体“com.template.IState” 有关详细信息,请参见{}”

我已经为我的状态创建了一个模式,但正在使用state类

Field iValue = IState.class.getDeclaredField("IValue");
将其更改为模式持久性类实现了以下目的:

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

谢谢joel,这在一定程度上解决了这个问题。测试现在通过了。但是,当我从web api通过CordaRPCOps运行查询时,仍然会出现错误(“请注册实体'com.template.SharedItemState')。我推动了项目(),您可以通过启动并运行“curl”来重新设置错误。再次感谢你的帮助,乔尔,我又一次催促你,让你更容易重述。启动节点并运行上面的run RPC Client configurationEdited post。看起来您还需要注册要使用的架构。如何在web api中注册这些自定义架构?有没有办法通过CordaRPCOps实现这一点?问题实际上是由于在Vault CustomQuery中未使用实体属性造成的。您看到的错误消息提供了一些提示,但可能会提供更多信息:“请注册实体‘com.template.SharedItemState’”。您应该始终引用合同状态实体属性(而不是合同状态属性)中的属性。因此,不是:linkField=SharedItemState.class.getDeclaredField(“link”);您应该使用:linkField=SharedItemSchemaV1.PersistentSharedItem.class.getDeclaredField(“链接”);谢谢joel,这在一定程度上解决了这个问题。测试现在通过了。但是,当我从web api通过CordaRPCOps运行查询时,仍然会出现错误(“请注册实体'com.template.SharedItemState')。我推动了项目(),您可以通过启动并运行“curl”来重新设置错误。再次感谢你的帮助,乔尔,我又一次催促你,让你更容易重述。启动节点并运行上面的run RPC Client configurationEdited post。看起来您还需要注册要使用的架构。如何在web api中注册这些自定义架构?有没有办法通过CordaRPCOps实现这一点?问题实际上是由于在Vault CustomQuery中未使用实体属性造成的。您看到的错误消息提供了一些提示,但可能会提供更多信息:“请注册实体‘com.template.SharedItemState’”。您应该始终引用合同状态实体属性(而不是合同状态属性)中的属性。因此,不是:linkField=SharedItemState.class.getDeclaredField(“link”);您应该使用:linkField=SharedItemSchemaV1.PersistentSharedItem.class.getDeclaredField(“链接”);