为什么使用 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 测试网的节点上。
我一直在尝试将 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 测试网的节点上。