Spring io @Autowired:空白的最终字段可能尚未初始化

2022-09-01 10:11:34

我在这里假设这是一个非常基本的问题 -

关于这个错误有几种问题,但在前5个结果中没有一个具有Spring的细微差别。

我有一个在春天写的REST-ful Webapp的开始。我正在尝试将其连接到数据库。

我有一个名为 Workspace 的实体,并且正在尝试使用 Bean 的 spring 注入(正确的术语 ?)来保存工作区实体的实例

package com.parrit;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.parrit.models.Workspace;
import com.parrit.models.WorkspaceRepository;

@RestController
@RequestMapping("/workspace")
public class WorkspaceController {

    @Autowired
    private final WorkspaceRepository repository;

    @RequestMapping(method = RequestMethod.POST)
    void save( @RequestBody String workspaceHTML) {
        Workspace ws = new Workspace();
        ws.setHTML(workspaceHTML);
        repository.save(ws);
    }
}

我的错误是在存储库变量上。编译器抱怨它可能无法初始化,并且尝试运行应用会产生相同的结果。private final WorkspaceRepository repository

如何将此存储库对象的实例放入我的控制器中,以便对其执行保存操作?


答案 1

在一个领域拥有和最终是矛盾的。@Autowired

后者说:这个变量有一个且只有一个值,它在构造时初始化。

前者说:Spring将构造对象,将此字段保留为null(其默认值)。然后,Spring 将使用反射来初始化此字段,并使用 WorkspaceRepository 类型的 Bean。

如果您希望最终字段自动连接,请使用构造函数注入,就像您自己进行注入一样:

@Autowired
public WorkspaceController(WorkspaceRepository repository) {
    this.repository = repository;
}

答案 2

确切地说,您必须提供一个分配最终字段的构造函数

private final WorkspaceRepository repository;

@Autowired
public WorkspaceController(WorkspaceRepository repository){
  this.repository = repository;
}

Spring将能够弄清楚如何初始化对象并通过构造函数注入存储库。


推荐