2016-01-03 10 views
12

co zakładam jest dość podstawowe pytanie tutaj-Wiosna io @Autowired: Puste pola końcowe mogą nie zostały zainicjowane

Istnieje kilka smaki pytania dotyczące tego błędu, ale nie w ciągu pierwszych 5 wyników, które mają dodany niuans wiosny.

Mam początki aplikacji webowej REST-ful napisanej wiosną. Próbuję połączyć go z bazą danych.

Mam podmiot o nazwie Workspace i staram się użyć zastrzyk wiosennych fasoli (poprawna terminologii?), Aby zapisać wystąpienie podmiotu obszarze roboczym

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

Mój błąd jest w repozytorium zmiennej private final WorkspaceRepository repository. Kompilator skarży się, że nie można go zainicjować, a próba uruchomienia aplikacji daje taki sam wynik.

Jak uzyskać wystąpienie obiektu tego repozytorium w moim kontrolerze w celu wykonania na nim operacji składowania?

Odpowiedz

20

uwzględniając @Autowired i finał na polu są sprzeczne.

Ten ostatni mówi: ta zmienna ma jedną i tylko jedną wartość i jest inicjowana w czasie budowy.

Pierwsza z nich mówi: Wiosna skonstruuje obiekt, pozostawiając to pole jako zerowe (wartość domyślna). Następnie Spring użyje odbicia, aby zainicjować to pole za pomocą fasoli typu WorkspaceRepository.

Jeśli chcesz pola końcowe autowired użyć konstruktora wtrysku, tak jak byś zrobił, gdybyś zrobił zastrzyk przez siebie:

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

Dokładnie, musisz podać konstruktor przypisujący końcową boiska

private final WorkspaceRepository repository; 

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

i wiosną będą mogli dowiedzieć się, w jaki sposób zainicjować obiektu i wstrzyknąć do repozytorium przez konstruktora

Powiązane problemy