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

问题描述 投票:0回答:2

我认为这是一个非常基本的问题-

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

我在 Spring 编写了一个 REST 风格的 Web 应用程序。我正在尝试将其连接到数据库。

我有一个名为 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
。编译器抱怨它可能未初始化,并且尝试运行应用程序会产生相同的结果。

如何将此存储库对象的实例获取到我的控制器中以便对其进行保存操作?

java spring spring-mvc spring-data
2个回答
84
投票

在场地上有

@Autowired
final
矛盾

后者表示:该变量只有一个值,并且在构造时初始化。

前者表示:Spring 将构造该对象,并将该字段保留为 null(其默认值)。然后Spring将使用反射用类型为

WorkspaceRepository
的bean来初始化该字段。

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

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

11
投票

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

private final WorkspaceRepository repository;

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

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

© www.soinside.com 2019 - 2024. All rights reserved.