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

Spring Beans:可以向已注入的List集合中添加元素吗?

错误根因

该异常和Spring Bean注入逻辑无关,是你定义Bean时返回的集合本身不支持修改操作:
Arrays.asList()返回的是Arrays内部的静态ArrayList实现,该实现没有重写add()、remove()等修改集合结构的方法,调用上述方法就会抛出UnsupportedOperationException。

解决方案

方案1:修改Bean定义返回可修改集合(最推荐)

直接在配置类中把Arrays.asList的结果包装为标准java.util.ArrayList即可,现有控制器注入逻辑无需调整:

@Configuration
public class BookConfig {

    @Bean
    public static List<Book> books() {
        return new ArrayList<>(Arrays.asList(
            new Book(1, "ABC", "Author ABC"),
            new Book(2, "DEF", "Author DEF"),
            new Book(3, "GHI", "Author GHI")));
    }
}

方案2:控制器注入时转换为可修改集合

如果不方便修改配置类的Bean定义,可以在控制器构造注入时做转换:

@Autowired
public BookRestController(List<Book> books) {
    this.books = new ArrayList<>(books);
}

注意:该方案每个控制器实例会持有独立的列表副本,多个组件依赖该Bean时修改不会同步,仅适合单组件依赖该集合的场景使用。

方案3:使用线程安全集合(生产环境多并发场景推荐)

普通ArrayList不是线程安全的,高并发场景下修改会有数据一致性问题,建议定义Bean时直接返回线程安全集合:

@Bean
public static List<Book> books() {
    return Collections.synchronizedList(new ArrayList<>(Arrays.asList(
        new Book(1, "ABC", "Author ABC"),
        new Book(2, "DEF", "Author DEF"),
        new Book(3, "GHI", "Author GHI"))));
}

遍历该集合时需要手动加锁保证并发安全。


内容的提问来源于stack exchange,提问作者Gabi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:09:04