@Autowired字段在一个SpringMVC控制器中为空,而其他字段工作

时间:2013-08-09 11:19:50

标签: spring-mvc

我有一个非常简单和经典的页面,其中包含一个Spring MVC控制器和一个jsp(这里的JSP不相关):

@Controller
public class PlayListListController  extends BaseController<PlayList> {

    @Autowired UserRepository userRepository;

    @RequestMapping("/playlist/{userName}")
    private ModelAndView displayList(@PathVariable("userName") String userName) {
        User user = userRepository.getUserByUserName(userName);
        ....
    }

}

我的问题如下。当我想使用URL http://localhost:8080/playlist/foo访问我的页面时,它会在第8行的控制器中抛出NullPointeurException。

    User user = userRepository.getUserByUserName(userName);

调试时,我发现userRepository确实是空的。

userRepository应该由Spring注入,而在我所有的其他控制器中,它都很好:Sptring正确地注入了相同的bean(userRepository)。

为什么在这个特定的控制器(与所有其他包在同一个包中)由Spring实例化并调用,userRepository为null? 我根本不明白。欢迎提出任何建议。

谢谢! 埃米尔。

2 个答案:

答案 0 :(得分:6)

当我按照这种方式进行时,我找到了答案:我在控制器中创建了一个@PostConstruct方法,以查看是否在开头注入了userRepository。实际上,当@PostConstruct方法运行时,userRepository不为null。调试我的methodi时发现了对象的id (在eclipse上的视图变量中)是307.此外,在调试displayList方法时,“this”显示了一个代理。所以,看起来@postconstruct方法test()正在bean中运行@RequestMapping displayList方法在代理中运行。在代理中,userRepository将为null。

那么为什么@RequestMapping displayList()在代理中运行? 原因是我的方法是私人。如果我将displayList()转换为公共方法,一切正常。

答案 1 :(得分:1)

一些想法:

  • 将Spring日志记录打开到INFO级别,您应该在应用程序启动期间看到一些日志记录语句,告诉您哪些控制器已映射到哪些URL。查看是否列出了此控制器。如果没有,它就不会被春天识别为控制器。

  • 您是否已将此控制器声明为未由xml中的<context:component-scan>标记扫描的命名空间?

  • 正如@coder提到的那样,确保bean尚未在XML上下文中声明