Spring Boot JPA获取列表添加元素报错问题咨询
你的解决方案完全正确,报错也属于预期场景!
为什么会抛出UnsupportedOperationException?
问题的核心出在你Order实体的getTransactionRefs()方法里:
public List<String> getTransactionRefs(){ if (this.transactionRefs != null) { return Arrays.asList(this.transactionRefs.split(",")); } return null; }
你调用的Arrays.asList()返回的可不是我们日常用的java.util.ArrayList——它是JDK内部的java.util.Arrays$ArrayList,一个固定大小的列表实现。这个类继承了AbstractList,但根本没实现add()、remove()这些修改列表结构的方法。当你直接对它调用add()时,会触发AbstractList里的默认实现,直接抛出异常,这完全是JDK设计的预期行为。
你的解决方案为什么有效?
这段代码:
transactionList = new ArrayList<>(transactionList);
通过ArrayList的构造方法,把固定大小列表里的元素全部拷贝到了一个全新的、可自由修改的ArrayList实例中。之后再调用add()自然就不会有问题了,这个处理方式完全正确。
可以优化的地方
其实你可以把转换逻辑提前到getter方法里,让调用方不用每次手动处理:
public List<String> getTransactionRefs(){ if (this.transactionRefs != null) { // 直接返回可修改的ArrayList return new ArrayList<>(Arrays.asList(this.transactionRefs.split(","))); } // 建议返回空列表而非null,避免调用方额外做null判断 return new ArrayList<>(); }
另外补充一点:你提到首次保存时会把transactionRefs转为ArrayList,但你的getter方法直接覆盖了这个逻辑——把字符串split后用固定大小列表返回,这才是问题的核心诱因,调整getter后就能从根源避免这类问题。
内容的提问来源于stack exchange,提问作者T Anna
相关产品推荐
相关产品推荐

