2017-03-06 9 views
-1

Ich kann keine Daten in das Modell einfügen, da Spring keine Bean an den Controller sendet, Referenz ist null. Bean-Schnittstelle und Implementierung im selben Paket wie Controller. Ich habe versucht, verfügbare Beans durch die Implementierung ApplicationContextAware in Controller (auch in Test mit Ausgabe an Konsole in der Methode setApplicationContext versucht, aber Methode nicht aufgerufen, gab es keine Ausgabe), aber es ist auch null. Ich benutze automatische Konfiguration, Implementierung der Schnittstelle, die als Bean mit der Nummer @Component, @ComponentScan aktiviert in Servlet-Config-Klasse verwendet. Dies ist Controller:Spring 4.3.6 Bean kann keine Bean in den Controller injizieren

package webapp.mvc; 

import org.springframework.beans.BeansException; 
import org.springframework.beans.factory.BeanFactory; 
import org.springframework.beans.factory.BeanFactoryAware; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationContext; 
import org.springframework.context.ApplicationContextAware; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 



@Controller 
public class HomeController implements ApplicationContextAware { 

    public QuoteResource quoteResource; 


    public ApplicationContext context; 

    public HomeController() { 
    } 

    @Autowired 
    public HomeController(QuoteResource resource) { 
     this.quoteResource = resource; 
     System.out.println("Constructor with resource triggered"); 
    } 

    @RequestMapping(value="/", method=RequestMethod.GET) 
    public String home(){ 
     System.out.println("Controller triggered"); 
     return "home"; 
    } 

    @RequestMapping(value="/random", method=RequestMethod.GET) 
    public String randomQuotes(Model model){ 
     model.addAttribute("randomQuote", quoteResource.getQuote()); 
     return "random"; 
    } 

    @Autowired 
    @Override 
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { 
     this.context = applicationContext;  
    } 

} 

Wenn ich Test starten ist druckt "Ressource ist null: wahr Test starten Constructor mit Ressource ausgelöst" und schlägt mit nullPointerException in Zeile model.addAttribute("randomQuote", quoteResource.getQuote()); Dies ist Test:

package spr1; 

import org.junit.Before; 
import org.junit.Test; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.web.servlet.MockMvc; 
import org.springframework.web.servlet.view.InternalResourceView; 

import webapp.mvc.HomeController; 
import webapp.mvc.QuoteResource; 

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; 
import static org.springframework.test.web.servlet.setup.MockMvcBuilders.*; 


public class RandomQuoteTest { 

    @Autowired 
    public QuoteResource resource; 

    @Before 
    public void initObjects() { 
     System.out.println("Resource is null:"); 
     System.out.println(resource == null); 
    } 

    @Test 
    public void test() throws Exception { 
     System.out.println("Start test"); 
     HomeController controller = new HomeController(resource); 
     MockMvc mvc = standaloneSetup(controller) 
       .setSingleView(new InternalResourceView("src/main/webapp/views/random.jsp")) 
       .build(); 
     mvc.perform(get("/random")) 
     .andExpect(view().name("random")); 
    } 

} 

QuoteResource ist Schnittstelle mit einer Implementierung, die mit @Component annotiert ist, aber ihr Konstruktor wird nicht aufgerufen (ich schreibe auf Konsole in Konstrukt oder)

+0

Sieht aus wie es ein Konfigurationsfehler ist. Wo haben Sie den Komponentenscan konfiguriert? – Jens

+0

In der Servlet Config Klasse habe ich '@ ComponentScan' zusammen mit '@ Configuration' und' @ EnableWebMvc' – krund

+0

Bitte fügen Sie es zur Frage hinzu, weil es wichtig ist, Ihre Frage zu beantworten – Jens

Antwort

0

Es scheint wie @Autowired funktioniert nicht in MVC-Tests. Es funktioniert, wenn der Controller manuell HomeController controller = new HomeController(new XmlQuoteResource()); ohne Autoquote QuoteResource erstellt. Gefundene Lösung in Spring-Mvc-Showcase im Redirect-Beispiel.