自动装配的 bean 在 MVC 控制器中为空

Posted

技术标签:

【中文标题】自动装配的 bean 在 MVC 控制器中为空【英文标题】:Autowired bean is null in MVC Controller 【发布时间】: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());

【问题讨论】:

请显示控制器类和spring config的相关位 Why is my Spring @Autowired field null? 的可能重复项 【参考方案1】:

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

【讨论】:

非常感谢。现在可以了。我的测试更新了一点。 controller = new HelloWorldController(); 行已被删除,变量controller 被注释为@Autowired

以上是关于自动装配的 bean 在 MVC 控制器中为空的主要内容,如果未能解决你的问题,请参考以下文章

Spring之Bean的自动装配

Bean的自动装配

3.Spring自动装配

Autowired bean在CGLib代理中为null

Spring5Bean 的自动装配及注解开发

SpringBean自动装配