为什么使用 Oraclize 时出现 null cannot be cast to non-null type net.corda.core.identity.Party 错误?

Why do I get null cannot be cast to non-null type net.corda.core.identity.Party error with Oraclize?

我一直在尝试将 Oraclize 实施到我的 CorDapp 中,并且我创建的流程完美运行,但是当我尝试添加 Oraclize 查询时,我收到错误:null cannot be cast to non-null type net.corda.core.identity.Party.这是有问题的代码。

        val current = LocalDateTime.now().toString()
        val airplaneStatus = subFlow(OraclizeQueryAwaitFlow(
            datasource = "URL",
            query = "json(https://api.flightstats.com/flex/flightstatus/rest/v2/json/flight/status/" + flight.subSequence(0,2) + "/" + flight.subSequence(2, flight.length) + "/arr/" +
            current.subSequence(0,4) + "/" + current.subSequence(5,7) + "/" + current.subSequence(8,10) + "?appId=******&appKey=***********&utc=false).flightStatuses.status",
            proofType = ProofType.TLSNOTARY,
            delay = 1
        ))

航班是一个简单的航班 ID,例如 AC345 或 WS9405。整个流程在这里:https://pastebin.com/7uvPnjEf

更新: 我添加了 delay 参数但错误仍然存​​在(尝试了 0 和 1)。我还验证了 ProofType.TLSNOTARY 是非空的。

提前致谢!

记录错误报告:

[WARN ] 2018-07-10T16:08:00,619Z [Node thread-1] flow.[a0362ed5-74b5- 
4519-a80e-4adda70adca7].run - Terminated by unexpected exception {}
kotlin.TypeCastException: null cannot be cast to non-null type net.corda.core.identity.Party
at it.oraclize.cordapi.flows.OraclizeQueryAwaitFlow.call(OraclizeQueryAwaitFlow.kt:36) ~[InsureFlight-0.1.jar:?]
at it.oraclize.cordapi.flows.OraclizeQueryAwaitFlow.call(OraclizeQueryAwaitFlow.kt:18) ~[InsureFlight-0.1.jar:?]
at net.corda.core.flows.FlowLogic.subFlow(FlowLogic.kt:290) ~[corda-core-3.1-corda.jar:?]
at com.insureflight.flows.IssuePolicy$Initiator.call(IssuePolicy.kt:76) ~[cordapp-0.1.jar:?]
at com.insureflight.flows.IssuePolicy$Initiator.call(IssuePolicy.kt:37) ~[cordapp-0.1.jar:?]
at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:96) [corda-node-3.1-corda.jar:?]
at net.corda.node.services.statemachine.FlowStateMachineImpl.run(FlowStateMachineImpl.kt:44) [corda-node-3.1-corda.jar:?]
at co.paralleluniverse.fibers.Fiber.run1(Fiber.java:1092) [quasar-core-0.7.9-jdk8.jar:0.7.9]
at co.paralleluniverse.fibers.Fiber.exec(Fiber.java:788) [quasar-core-0.7.9-jdk8.jar:0.7.9]
at co.paralleluniverse.fibers.RunnableFiberTask.doExec(RunnableFiberTask.java:100) [quasar-core-0.7.9-jdk8.jar:0.7.9]
at co.paralleluniverse.fibers.RunnableFiberTask.run(RunnableFiberTask.java:91) [quasar-core-0.7.9-jdk8.jar:0.7.9]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [?:1.8.0_172]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [?:1.8.0_172]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180) [?:1.8.0_172]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) [?:1.8.0_172]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_172]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_172]
at net.corda.node.utilities.AffinityExecutor$ServiceAffinityExecutor$thread.run(AffinityExecutor.kt:62) [corda-node-3.1-corda.jar:?]

你忘记传第四个参数了,参数delay

OraclizeQueryAwaitFlow(val datasource: String,
                             val query: Any,
                             val proofType: Int = 0,
                             val delay: Int = 0) //here <------

为什么?

此参数不为空(它没有 elvis (?) 运算符)并且需要归因

从 github 上的库中读取存储库和您的日志错误([=32= 的第 36 行],请参阅 here),我认为问题的发生是因为

  • 调用serviceHub.identityService.wellKnownPartyFromX500Name(OraclizeUtils.getNodeName())return空值
  • 想要为 Party 转换空值,但这是不可能的,抛出一个 TypeCastException

我的建议

1.(推荐)在此存储库上打开一个问题,询问此错误解决方案并等待开发人员的响应,或者

2. 分叉此存储库,您验证此转换尝试并使用分叉的存储库

您是否在 public 测试网上加载了 Cordapp?如果不是,那可能是问题所在,因为 identityService 无法到达我们的 public 节点。我们目前正在开发一种用于在专用网络上进行测试的工具,但与此同时,您应该将您的 cordapp 加载到连接到 public 测试网的节点上。