2011-07-04 5 views
2

MVC ControllerクラスでBeanをオートワイヤリングしようとしていますが、null以外の値を取得できません。 beanのコンストラクタにthrow new Error("E")を入れて、helloWorldController beanに注入すると、例外が発生します。helloWorldControllerという名前のBeanを作成中にエラーが発生しました:autowired依存関係の注入が失敗しました。しかし、私がエラーコンストラクタなしでテストを実行すると、私はBeanを取得しない、私はnullを取得します。Autowired BeanはMVCコントローラでnullです

私は完全に混乱しています。それは何をするためのものか?コントローラーインスタンスを作成するときに依存関係を作成して注入しようとしています。さて、エラーが発生しなかった場合、なぜ変数が正式化されないのですか?

私はショーン・パトリック・フロイドの入札で私のポストを拡張しています

 
package testy.sprung; 

//import declarations ommited 

import testy.sprung.beany.AwiredBean; 

@Controller 
public class HelloWorldController { 
    private Logger log = Logger.getLogger("springTestLogger"); 
    @Autowired 
    private AwiredBean oz; 

    @RequestMapping("/sprung") 
    public ModelAndView base() { 
     log.debug("base URI"); 
     ModelAndView mv = new ModelAndView(); 
     mv.setViewName("firstPage"); 
     return mv; 
    } 

    @RequestMapping(value="/{articel}/{subTitle}",method=RequestMethod.GET) 
    public ModelAndView szia(@PathVariable("articel") String articel, @PathVariable("subTitle") String st, @RequestParam(value="co", required=false) String co) { 
     log.debug("Path GET/{articel}/{subtitle}: " + articel + "/" + st + "?co=" + co); 
     ModelAndView mv = new ModelAndView(); 
     mv.setViewName("index"); // now put index.jsp in /WEB-INF/files 
     mv.addObject("articel", articel); 
     mv.addObject("subtl", st); 
     mv.addObject("co", co); 
     mv.addObject("awir", oz); //but it is null 
     return mv; 
    } 
}

Beanは任意の空のインターフェイスを実装:

 
package testy.sprung.beany; 

public class AwiredBeanImpl implements AwiredBean { 
    @Override 
    public String toString() { 
     return "CommonAutowired"; 
    } 

    public AwiredBeanImpl() { 
     throw new Error("E"); 
    } 
} 

は、私がテスト内でそれを実行します。私のエラーまたはNullPointerException天気を投げているのでテストは、失敗します。それはSpring管理Beanになるように

 
@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("file:WebContent/WEB-INF/sprung-servlet.xml") 
public class ZakladniExtendedTest extends TestCase { 
    private MockHttpServletRequest request; 
    private MockHttpServletResponse response; 
    private HelloWorldController controller; 
    @Inject 
    private ApplicationContext context; 

    public ZakladniExtendedTest() { 
     PropertyConfigurator.configure("t-resources/log4j.properties"); 
    } 

    @Before //this method is called before each test 
    public void setUp() { 
     request = new MockHttpServletRequest(); 
     response = new MockHttpServletResponse(); 
     controller = new HelloWorldController(); 
    } 

    @Test 
    public void testThemeResolverExists() { //this test works 
     assertTrue(context.containsBean("themeResolver")); 
    } 

    @Test 
    public void autowiringTest() throws Exception { //but this not 
     request.setRequestURI("/title/subtitle"); 
     request.setMethod("GET"); 
     request.setParameter("co", "param"); 
     ModelAndView mav = new AnnotationMethodHandlerAdapter().handle(request, response, controller); 
     String viewName = mav.getViewName(); 
     Map objects = mav.getModel(); 

     assertEquals("index", viewName); 
     //NullPointerException follows: 
     assertEquals("CommonAutowired", objects.get("awir").toString()); 
    } 
} 
+1

コントローラクラスと関連するビット設定を表示してください –

+0

[なぜ私のSpring @Autowiredフィールドはnullですか?](http://stackoverflow.com/questions/19896870/why-is-my-spring -autowired-field-null) – chrylis

答えて

6

代わりのcontroller = new HelloWorldController();あなたのコントローラーを注入する必要があります。

+0

ありがとうございました。それは今働く。私は少しテストを更新しました。 'controller = new HelloWorldController();'という行は削除され、変数 'controller'は' @ Autowired'として注釈されています。 –

+0

私はお手伝いします。 – abalogh

関連する問題