如何修复 Corda 3.3 RPC 客户端中的 "com.esotericsoftware.kryo.KryoException: java.lang.ClassCastException"

How to fix "com.esotericsoftware.kryo.KryoException: java.lang.ClassCastException" in Corda 3.3 RPC client

我正在构建一个 Spring 引导 Web 服务器,使用 CordaRPCClient 作为 Corde 节点的中间件。从节点查询当前时间工作正常。但是在调用

Set matchingParties = CordaClient.getInstance().proxy.partiesFromName("PartyB", false);

我得到以下堆栈跟踪:

com.esotericsoftware.kryo.KryoException: java.lang.ClassCastException: org.bouncycastle.asn1.DLSequence cannot be cast to org.bouncycastle.asn1.ASN1Integer
    Serialization trace:
    owningKey (net.corda.core.identity.Party)
    value (net.corda.core.utilities.Try$Success)
            at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:144) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer.read(CompatibleFieldSerializer.java:147) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:813) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:134) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.serializers.CollectionSerializer.read(CollectionSerializer.java:40) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:731) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.serializers.CompatibleFieldSerializer.read(CompatibleFieldSerializer.java:147) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.Kryo.readClassAndObject(Kryo.java:813) ~[kryo-4.0.0.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme$deserialize$$inlined$use$lambda.invoke(KryoSerializationScheme.kt:97) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme$deserialize$$inlined$use$lambda.invoke(KryoSerializationScheme.kt:37) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme.withContext(KryoSerializationScheme.kt:80) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme.access$withContext(KryoSerializationScheme.kt:37) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme$deserialize$$inlined$use$lambda.execute(KryoSerializationScheme.kt:95) ~[corda-node-api-3.3-corda.jar!/:na]
            at com.esotericsoftware.kryo.pool.KryoPoolQueueImpl.run(KryoPoolQueueImpl.java:61) ~[kryo-4.0.0.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.AbstractKryoSerializationScheme.deserialize(KryoSerializationScheme.kt:94) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize.invoke(SerializationScheme.kt:111) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.core.serialization.SerializationFactory.withCurrentContext(SerializationAPI.kt:66) ~[corda-core-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize.invoke(SerializationScheme.kt:111) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl$deserialize.invoke(SerializationScheme.kt:86) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.core.serialization.SerializationFactory.asCurrent(SerializationAPI.kt:80) ~[corda-core-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.SerializationFactoryImpl.deserialize(SerializationScheme.kt:111) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.RPCApi$ServerToClient$Companion.fromClientMessage(RPCApi.kt:360) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.client.rpc.internal.RPCClientProxyHandler.artemisMessageHandler(RPCClientProxyHandler.kt:268) ~[corda-rpc-3.3-corda.jar!/:na]
            at net.corda.client.rpc.internal.RPCClientProxyHandler.access$artemisMessageHandler(RPCClientProxyHandler.kt:71) ~[corda-rpc-3.3-corda.jar!/:na]
            at net.corda.client.rpc.internal.RPCClientProxyHandler$start.invoke(RPCClientProxyHandler.kt:206) ~[corda-rpc-3.3-corda.jar!/:na]
            at net.corda.client.rpc.internal.RPCClientProxyHandler$start.invoke(RPCClientProxyHandler.kt:71) ~[corda-rpc-3.3-corda.jar!/:na]
            at net.corda.client.rpc.internal.RPCClientProxyHandlerKt$sam$MessageHandler468063.onMessage(RPCClientProxyHandler.kt) ~[corda-rpc-3.3-corda.jar!/:na]
            at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.callOnMessage(ClientConsumerImpl.java:1003) ~[artemis-core-client-2.4.0.jar!/:2.4.0]
            at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl.access0(ClientConsumerImpl.java:50) ~[artemis-core-client-2.4.0.jar!/:2.4.0]
            at org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl$Runner.run(ClientConsumerImpl.java:1126) ~[artemis-core-client-2.4.0.jar!/:2.4.0]
            at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:42) [artemis-commons-2.4.0.jar!/:2.4.0]
            at org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:31) [artemis-commons-2.4.0.jar!/:2.4.0]
            at org.apache.activemq.artemis.utils.actors.ProcessorBase$ExecutorTask.run(ProcessorBase.java:53) [artemis-commons-2.4.0.jar!/:2.4.0]
            at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.8.0_201]
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.8.0_201]
            at java.lang.Thread.run(Unknown Source) [na:1.8.0_201]
    Caused by: java.lang.ClassCastException: org.bouncycastle.asn1.DLSequence cannot be cast to org.bouncycastle.asn1.ASN1Integer
            at org.bouncycastle.asn1.pkcs.PrivateKeyInfo.<init>(Unknown Source) ~[bcprov-jdk15on-1.57.jar!/:1.57.0]
            at org.bouncycastle.asn1.pkcs.PrivateKeyInfo.getInstance(Unknown Source) ~[bcprov-jdk15on-1.57.jar!/:1.57.0]
            at net.corda.core.crypto.Crypto.decodePrivateKey(Crypto.kt:301) ~[corda-core-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.PrivateKeySerializer.read(Kryo.kt:322) ~[corda-node-api-3.3-corda.jar!/:na]
            at net.corda.nodeapi.internal.serialization.kryo.PrivateKeySerializer.read(Kryo.kt:314) ~[corda-node-api-3.3-corda.jar!/:na]
            at com.esotericsoftware.kryo.Kryo.readObject(Kryo.java:731) ~[kryo-4.0.0.jar!/:na]
            at com.esotericsoftware.kryo.serializers.ObjectField.read(ObjectField.java:125) ~[kryo-4.0.0.jar!/:na]
            ... 36 common frames omitted

谁能看到这个问题并告诉我如何解决这个问题?

已知这是RPC客户端使用的Corda版本和节点使用的Corda版本不同导致的。如果两者都使用相同版本的 Corda,这应该有效。