corda - java.io.NotSerializableException : Constructor parameter arg0 doesn't refer to a property of class

标签 corda

在 IntelliJ 中运行 Corda 合约测试时,用 Java 编写的测试有时会失败,并出现以下异常:

[ERROR] 17:02:51,821 [main] (Schema.kt:437) amqp.Schema.fingerprintForType - Constructor parameter arg0 doesn't refer to a property of class 'class mypackage.MyState' -> class mypackage.MyState {} java.io.NotSerializableException: Constructor parameter arg0 doesn't refer to a property of class 'class mypackage.MyState' at net.corda.nodeapi.internal.serialization.amqp.SerializationHelperKt.propertiesForSerializationFromConstructor(SerializationHelper.kt:249) ~[corda-node-api-corda-3.0.jar:?]

我该如何解决这个问题?

最佳答案

正如 Joel 所解释的,默认情况下,已编译的 Java 类将为其构造函数参数使用默认名称。在 Corda 的情况下,我们应该对参数名称使用相同的名称,不是因为它们更好地识别它们或者它们保持相同的名称很漂亮,而是因为 AMQP 通过实现的序列化和反序列化过程中有一个验证专门为 Corda (corda-node-api) 定制和重写的组件。该组件检查事务(ContractState)期间涉及的每个属性。提醒一下,在 Corda 中,所有的序列化和反序列化都是受控的,如果发生冲突,可能会失败。

要解决这个问题,有不同的形式,这取决于你使用哪个工具来自动化编译 - gradle、maven 等。这是一个独立于 IDE(Eclipse、IntelliJ 等)的解决方案。

Maven - pom.xml

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <compilerArgs>
                    <arg>-verbose</arg>
                    <arg>-parameters</arg> <!-- To keep parameter names-->
                    <arg>-Xlint:all,-options,-path</arg>
                </compilerArgs>
            </configuration>
        </plugin>

有关 Pass Compiler Arguments Maven 的更多信息 https://maven.apache.org/plugins/maven-compiler-plugin/examples/pass-compiler-arguments.html

build.gradle - Gradle

tasks.withType(JavaCompile) {
    options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" << "-Xlint:-options" << "-parameters"
}

有关 CompileOptions Gradle 的更多信息 https://docs.gradle.org/current/dsl/org.gradle.api.tasks.compile.CompileOptions.html

您可以在此处查看有关如何设置 compileOptions 的 StackOverflow 帖子 How can I set the compileOptions for my Gradle Java plugin?

关于corda - java.io.NotSerializableException : Constructor parameter arg0 doesn't refer to a property of class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48772259/

相关文章:

corda - 如果 R3 清算,Corda 会发生什么

corda - Corda 能抵抗扭曲或操纵吗?

java - 如何为 Corda RPC 用户创建 Web 身份验证?

corda - 将 Corda 现金状态兑换为传统现金

postgresql - 如何将postgres配置添加到cordas build gradle deployNodes-task

gradle - 为什么我的 deploy1Node 任务失败并提示 java.lang.ClassCastException : sun. nio.fs.UnixPath can be cast to java.lang.String?

java - corda实现通用vault查询

Corda R3 DeployNodes 命令失败,例如cordapp

kotlin - 在CORDA中动态部署和运行节点

spring-boot - 创建名称为 'gsonBuilder' 的 bean 在类路径资源 [org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration.class] 中定义时出错