TransactionBuilder发送至其他参与方后无法添加状态的异常问题咨询
解决TransactionBuilder添加状态时的UnsupportedOperationException问题
这问题我在Corda开发过程中碰到过好几次,核心原因很明确:你拿到的TransactionBuilder里的状态集合是不可修改的(UnmodifiableCollection),直接调用add方法自然会抛出这个异常。
为什么会出现这个情况?
通常是因为PartyA在发送TransactionBuilder之前,这个对象的状态列表已经被转换成了不可修改的集合——可能是调用了Corda API里返回不可修改集合的方法,或者手动用Collections.unmodifiableList()处理过,导致PartyB收到的builder无法直接修改内部状态集合。
两种可行的解决方案
方案1:PartyB创建新的TransactionBuilder复制原内容
收到builder后,不要直接在原对象上操作,而是新建一个TransactionBuilder,把原builder里的所有核心内容(状态、命令、公证人、时间窗等)都复制过去,再添加新状态。示例代码(Kotlin):
// 接收PartyA发来的TransactionBuilder val receivedBuilder = ... // 新建builder,指定相同的公证人 val newBuilder = TransactionBuilder(receivedBuilder.notary) // 复制原有的状态、命令 newBuilder.addAllStates(receivedBuilder.states) newBuilder.addAllCommands(receivedBuilder.commands) // 如果有时间窗也复制过去 receivedBuilder.timeWindow?.let { newBuilder.setTimeWindow(it) } // 现在可以安全添加新状态了 newBuilder.addState(yourNewState)
方案2:PartyA发送前确保状态集合可修改
让PartyA在发送TransactionBuilder之前,把内部的状态集合转换成可变集合,再封装成新的builder发送。示例代码(Kotlin):
// PartyA这边的原builder val originalBuilder = ... // 将状态转成可变列表,创建新builder val mutableStates = ArrayList(originalBuilder.states) val sendableBuilder = TransactionBuilder(originalBuilder.notary) sendableBuilder.addAllStates(mutableStates) sendableBuilder.addAllCommands(originalBuilder.commands) // 发送这个新的sendableBuilder给PartyB
这样无论是哪端调整,都能避免操作不可修改集合的问题,顺利添加新状态。
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

