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
相关产品推荐
相关产品推荐

