【问题标题】:Autowired bean is null in MVC Controller自动装配的 bean 在 MVC 控制器中为空
【发布时间】:2011-09-28 00:31:18
【问题描述】:

我正在尝试在 MVC 控制器类中自动装配一个 bean,但我无法获得另一个值,而不是 null。当我将 throw new Error("E") 放入要注入 helloWorldController bean 的 bean 的构造函数中时,我得到一个异常:Error creation bean with name helloWorldController: Injection of autowired dependencies failed. 但是当我运行在构造函数中没有 error 的测试,我没有得到 bean,我得到 null。

我完全糊涂了。它有什么作用?它在创建控制器实例时尝试创建和注入依赖项。好的,如果没有发生错误,为什么变量没有初始化?

在肖恩·帕特里克·弗洛伊德 (Sean Patrick Floyd) 的要求下,我延长了我的职位:

包 testy.sprung; //导入声明省略 导入 testy.sprung.beany.AwiredBean; @控制器 公共类 HelloWorldController { 私人 Logger log = Logger.getLogger("springTestLogger"); @自动连线 私人 AwiredBean 盎司; @RequestMapping("/sprung") 公共模型和视图基础(){ log.debug("基础 URI"); ModelAndView mv = new ModelAndView(); mv.setViewName("firstPage"); 返回 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("路径 GET/{articel}/{subtitle}:" + articel + "/" + st + "?co=" + co); ModelAndView mv = new ModelAndView(); mv.setViewName("索引"); // 现在将 index.jsp 放入 /WEB-INF/files mv.addObject("articel", articel); mv.addObject("subtl", st); mv.addObject("co", co); mv.addObject("awir", oz); //但它是空的 返回 mv; } }

bean 实现任何空接口:

包 testy.sprung.beany; 公共类 AwiredBeanImpl 实现 AwiredBean { @覆盖 公共字符串 toString() { 返回“CommonAutowired”; } 公共 AwiredBeanImpl() { 抛出新错误(“E”); } }

我在测试中运行它。测试失败,因为我的错误或NullPointerException 被抛出:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("文件:WebContent/WEB-INF/sprung-servlet.xml") 公共类 ZakladniExtendedTest 扩展 TestCase { 私有 MockHttpServletRequest 请求; 私有 MockHttpServletResponse 响应; 私有 HelloWorldController 控制器; @注入 私有 ApplicationContext 上下文; 公共 ZakladniExtendedTest() { PropertyConfigurator.configure("t-resources/log4j.properties"); } @Before //这个方法在每次测试之前被调用 公共无效设置(){ 请求 = 新的 MockHttpServletRequest(); 响应 = 新的 MockHttpServletResponse(); 控制器 = 新的 HelloWorldController(); } @测试 public void testThemeResolverExists() { //这个测​​试有效 assertTrue(context.containsBean("themeResolver")); } @测试 public void autowiringTest() throws Exception { //但这不是 request.setRequestURI("/title/subtitle"); request.setMethod("GET"); request.setParameter("co", "param"); ModelAndView mav = new AnnotationMethodHandlerAdapter().handle(request, response, controller); String viewName = mav.getViewName(); 地图对象 = mav.getModel(); assertEquals("index", viewName); //NullPointerException 如下: assertEquals("CommonAutowired", objects.get("awir").toString()); } }

【问题讨论】:

标签: model-view-controller spring autowired


【解决方案1】:

你应该注入你的控制器,而不是controller = new HelloWorldController();,让它成为一个Spring管理的bean。

【讨论】:

  • 非常感谢。现在可以了。我的测试更新了一点。 controller = new HelloWorldController(); 行已被删除,变量controller 被注释为@Autowired
猜你喜欢
  • 1970-01-01
  • 2014-09-08
  • 2013-09-28
  • 2018-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
相关资源
最近更新 更多