【问题标题】:Spring Beans: Can you add elements into an injected list? [duplicate]Spring Beans:您可以将元素添加到注入列表中吗? [复制]
【发布时间】:2021-09-23 11:33:00
【问题描述】:

我是 Spring Beans 的新手,我正在尝试构建一个实现 CRUD 操作的 rest 控制器。

我有一个配置文件,其中有一个 @Bean,它返回 Book 类型的列表:

@Configuration
public class BookConfig {

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

以及我在其中构造函数注入上述 Bean 的其余控制器:

@RestController
@RequestMapping("/api/v1/books")
public class BookRestController {

    private List<Book> books;

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

    @PostMapping("")
    public void registerBook(@RequestBody Book book) {
        books.add(book); // this throws **UnsupportedOperationException**
    }
}

在 POST 方法中,我尝试将来自请求的 book 添加到我的 books 列表中,但我得到 UnsupportedOperationException .

是否无法更改注入的集合或应该如何完成?

【问题讨论】:

标签: spring exception collections javabeans code-injection


【解决方案1】:

如果这是出于教程目的,我们可以通过小步骤再次实现这一点。

  • 您可以创建一个托管列表的类。
  • 我们可以在该类中提供 getter 和 setter 方法。
  • 之后注入这个类。

类会变成

//BadNamedCLass
DataManager {
 private final List<Book> books = ArrayList<Book>();
 {
 // init block to add item to books if you want during initialization
 }
// getters
//setters
}

配置变为:

@Configuration
public class BookConfig {

    @Bean
    public DataManager dataManager() {
        return new DataManager();
    }
}

控制器代码变成

...
    @Autowired
    public BookRestController(DataManager dataManager) {
        this.dataManager= dataManager;
    }
...

例外情况请关注link

【讨论】:

  • 首先,感谢您抽出宝贵时间回复。那是相当快的tbh。我实施了解决方案,但仍然遇到同样的错误。在您提供的链接中似乎 Arrays.asList() 返回一个固定长度的列表,这就是为什么当我尝试添加新元素时它向我抛出了那个异常。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-22
  • 2017-02-12
  • 2021-05-17
  • 2015-08-13
  • 2019-12-20
  • 2023-04-10
  • 2010-12-12
相关资源
最近更新 更多