2016-01-03 16 views
12

başlatıldı olmayabilir burada-Bahar io @Autowired: Boş nihai alan ne varsayalım oldukça basit bir sorudur

Orada Bu hatayla ilgili olarak soruların birkaç çeşidi vardır, ama sahip ilk 5 sonuçlarında hiçbiri Baharın ek nüansı.

İlkbaharda yazılmış bir REST-ful webapp başlangıcım var. Onu bir veritabanına bağlamaya çalışıyorum.

ben bir varlık adında Workspace ve

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

Benim hata deposu değişken private final WorkspaceRepository repository üzerinde çalışma varlığın bir örneği kaydetmek için bir fasulye (doğru terminoloji?) Bahar enjeksiyonu kullanmaya çalışıyorum. Derleyici, başlatılamayabilir ve uygulamayı çalıştırmayı denediğinde aynı sonucu verdiğinden şikayetçidir.

Bu depo nesnesinin bir örneğini, üzerinde işlem kaydetmek için denetleyicime nasıl alabilirim?

cevap

20

aracılığıyla depo enjekte etmek mümkün olacak nihai alanını atar bir kurucu sağlamak zorunda ve bir alandaki final çelişkilidir.

İkincisi, bu değişkenin bir ve tek bir değere sahip olduğunu ve yapım zamanında başlatıldığını söylüyor.

Eski yazıyor ki: Spring nesneyi oluşturacak ve bu alanı boş bırakacaktır (varsayılan değeri). Ardından, Spring bu alanı, WorkspaceRepository tipi bir fasulye ile başlatmak için yansımayı kullanacaktır.

nihai alanları kendiniz enjeksiyon Bilseydin yapacağını gibi, yapıcı enjeksiyon kullanmak, autowired isterseniz:

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

Kesinlikle,

private final WorkspaceRepository repository; 

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

Ve Bahar nesneyi başlatmak için nasıl anlamaya ve @Autowired Having yapıcı

İlgili konular