You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:06:53