2017-03-06 14 views
-1

SpringがBeanをコントローラに接続しないため、モデルにデータを入れることができません。参照はnullです。コントローラと同じパッケージ内のBeanインタフェースと実装。コントローラ内にApplicationContextAwareを実装して利用可能なBeanを列挙しようとしました(メソッドsetApplicationContextのコンソール出力へのテストでも試行されましたが、メソッドは呼び出されず、出力もありませんでした)が、nullです。私は、サーブレット設定クラスで@Component@ComponentScanが有効になっているBeanとして使用されるインターフェイスの自動設定、実装を使用します。このコントローラである: を:「トリガー 真 スタートテスト コンストラクタリソースとリソースnullである」と。これはテストですラインでnullPointerExceptionmodel.addAttribute("randomQuote", quoteResource.getQuote()); で失敗します。私はテストがプリントされ起動するとSpring 4.3.6コントローラにbeanを挿入できません

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

} 

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は、@Componentと注釈が付けられた1つの実装とのインターフェイスですが、コンストラクタは呼び出されません(コンストラクタでコンソールに書き込みますまたは)

+0

設定に失敗したようです。コンポーネントスキャンはどこで設定しましたか? – Jens

+0

サーブレットの設定クラスには、@構成の設定と@ EnableWebMvcと一緒に '@ ComponentScan'があります – krund

+0

あなたの質問に答えることが重要なので、質問に追加してください – Jens

答えて

0

@Autowiredはmvcテストでは機能しません。コントローラが手動で作成した場合、QuoteResourceをオートワイヤリングしないで、HomeController controller = new HomeController(new XmlQuoteResource());が動作します。リダイレクトの例でspring-mvc-showcaseで見つかった解決策。

関連する問題