2016-01-03 6 views
12

, was ich davon ausgehen, eine ziemlich grundlegende Frage ist hier-Frühling io @Autowired: Der Rohling letzte Feld kann nicht initialisiert wurden

Es gibt mehrere Varianten von Fragen zu diesem Fehler, aber keine in den ersten 5 Ergebnisse, die haben die zusätzliche Nuance des Frühlings.

Ich habe die Anfänge einer REST-ful Webapp im Frühjahr geschrieben. Ich versuche, es mit einer Datenbank zu verbinden.

Ich habe eine Entität namens Workspace und ich versuche, die Feder Injektion einer Bohne zu verwenden (korrekte Terminologie?) Eine Instanz der Arbeitsbereich Einheit

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); 
    } 
} 

Mein Fehler auf dem Repository-Variable private final WorkspaceRepository repository ist zu speichern. Der Compiler beschwert sich, dass er möglicherweise nicht initialisiert wird und der Versuch, die App auszuführen, führt zu demselben Ergebnis.

Wie erhalte ich eine Instanz dieses Repository-Objekts in meinen Controller, um Operationen darauf zu speichern?

Antwort

20

Mit @Autowired injizieren und Finale auf einem Feld sind widersprüchlich.

Letzteres sagt: diese Variable hat einen und nur einen Wert und wird zur Konstruktionszeit initialisiert.

Der erste sagt: Spring wird das Objekt konstruieren und dieses Feld als Null (seinen Standardwert) verlassen. Spring verwendet dann Reflection, um dieses Feld mit einem Bean des Typs WorkspaceRepository zu initialisieren.

Wenn Sie letzte Felder autowired möchten, verwenden Sie Konstruktor Injektion, wie würden Sie tun, wenn Sie die Injektion selbst tat

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

Genau, haben Sie einen Konstruktor zur Verfügung zu stellen, die das letzte Feld

private final WorkspaceRepository repository; 

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

und Frühling wird in der Lage, herauszufinden, weist, wie das Objekt zu initialisieren und das Repository über den Konstruktor

Verwandte Themen