我有一个非常简单和经典的页面,其中包含一个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? 我根本不明白。欢迎提出任何建议。
谢谢! 埃米尔。
答案 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上下文中声明