web-dev-qa-db-ja.com

Spring io @Autowired:空白の最終フィールドは初期化されていない可能性があります

ここで私が推測するのはかなり基本的な質問です

このエラーに関する質問にはいくつかの種類がありますが、最初の5つの結果には、Springのニュアンスが追加されたものはありません。

私は、春に書かれたRESTフルWebアプリの始まりを持っています。データベースに接続しようとしています。

Workspaceという名前のエンティティがあり、Beanのスプリングインジェクション(正しい用語?)を使用して、ワークスペースエンティティのインスタンスを保存しようとしています。

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にあります。コンパイラーは、初期化されていない可能性があると不平を言っており、アプリを実行しようとしても同じ結果が得られます。

保存操作を行うために、このリポジトリオブジェクトのインスタンスをコントローラに取得するにはどうすればよいですか?

21
Pinwheeler

@Autowiredとフィールドのfinalは矛盾しています。

後者は、この変数はただ1つの値を持ち、構築時に初期化されると言います。

前者は、Springはオブジェクトを構築し、このフィールドをnull(デフォルト値)のままにします。次に、Springはリフレクションを使用して、WorkspaceRepository型のBeanでこのフィールドを初期化します。

最終フィールドを自動配線する場合は、自分で注入した場合と同じように、コンストラクター注入を使用します。

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

正確には、最終フィールドを割り当てるコンストラクターを提供する必要があります

private final WorkspaceRepository repository;

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

そして、Springはオブジェクトを初期化し、コンストラクタを介してリポジトリを注入する方法を理解することができます

9
Sleiman Jneidi