【问题标题】:Corda: error=org.hibernate.InstantiationException: No default constructor for entityCorda:error=org.hibernate.InstantiationException:没有实体的默认构造函数
【发布时间】:2018-01-10 12:44:19
【问题描述】:

我遇到了一个问题,请帮忙。基于 M13 的 Corda 代码。我的架构代码主要是使用定义架构参考您的示例。

object LegalContractSchemaV1 : MappedSchema(
        schemaFamily = LegalContractSchema.javaClass,
        version = 1,
        mappedTypes = listOf(PersistentLegalContractState::class.java)) {

    @Entity
    @Table(name = "legal_contract_states")
       class PersistentLegalContractState(
            @Column(name = "contract_title`enter code here`")
            var contractTitle: String,

            @Column(name = "sender_name")
            var senderName: String,

            @Column(name = "recipient_name")
            var recipientName: String,

            @Column(name = "status")
            var status: String) : PersistentState(){
      //  constructor(stateRef: StateRef) :  this(stateRef.txhash.bytes.toHexString(), stateRef.index)
    }

Corda 节点错误日志。 E 12:53:45 [rpc-server-handler-pool-0] vault.HibernateVaultQueryImpl._queryBy - org.hibernate.InstantiationException:没有默认构造函数 实体: : com.legalcontract.schema.LegalContractSchemaV1$PersistentLegalContractState E 12:53:45 [rpc-server-handler-pool-0] messing.ObservableContext.sendMessage - 发送消息失败, 踢客户。消息是 RpcReply(id=RpcRequestId(toLong=4982229886899153484), 结果=错误或(值=空,错误=org.hibernate.InstantiationException: 实体没有默认构造函数:: com.legalcontract.schema.LegalContractSchemaV1$PersistentLegalContractState)) com.esotericsoftware.kryo.KryoException:类 org.hibernate.InstantiationException 未注释或在 白名单,因此不能用于序列化 序列化跟踪: 错误(net.corda.core.ErrorOr) 在 net.corda.core.serialization.CordaClassResolver.checkClass(CordaClassResolver.kt:65) ~[corda-core-0.13.0.jar:?] 在 net.corda.core.serialization.CordaClassResolver.getRegistration(CordaClassResolver.kt:35) ~[corda-core-0.13.0.jar:?] 在 com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:488) ~[kryo-4.0.0.jar:?] 在 net.corda.nodeapi.RPCKryo.getRegistration(RPCStructures.kt:74) ~[corda-node-api-0.13.0.jar:?] 在 com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:97) ~[kryo-4.0.0.jar:?]

【问题讨论】:

    标签: kotlin corda


    【解决方案1】:

    您需要在 PersistentLegalContractState 的主体中添加一个默认构造函数。比如:

    constructor() : this("", "", "", "")
    

    【讨论】:

      【解决方案2】:

      kotlin-noarg 插件为已使用选定注释注释的类生成默认构造函数。

      申请 Kotlin-jpa 插件为注解@Entity 生成默认构造器。

      将脚本添加到 gradle 文件中

      buildscript {
          dependencies {
              classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
          }
      }
      
      apply plugin: "kotlin-jpa"
      

      【讨论】:

        【解决方案3】:

        在安装 kotlin-jpa 插件之后,我也遇到了同样的错误(org.hibernate.InstantiationException: No default constructor for entity)。

        解决方案是让我的自定义架构中的所有字段都可以为空,例如:

        object LegalContractSchemaV1 : MappedSchema(
            schemaFamily = LegalContractSchema.javaClass,
            version = 1,
            mappedTypes = listOf(PersistentLegalContractState::class.java)) {
        
        @Entity
        @Table(name = "legal_contract_states")
           class PersistentLegalContractState(
                @Column(name = "contract_title`enter code here`")
                var contractTitle: String? = null,
        
                @Column(name = "sender_name")
                var senderName: String? = null,
        
                @Column(name = "recipient_name")
                var recipientName: String? = null,
        
                @Column(name = "status")
                var status: String? = null) : PersistentState()
        

        【讨论】:

          猜你喜欢
          • 2017-10-20
          • 1970-01-01
          • 2019-08-08
          • 2020-02-07
          • 1970-01-01
          • 2014-10-16
          • 2015-03-19
          • 2023-03-20
          相关资源
          最近更新 更多