2

我有一个带有 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 注入,而在我的所有其他控制器中,它发生得很好:同一个 bean (userRepository) 由 Spring 正确注入。

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

谢谢!埃米尔。

4

2 回答 2

7

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

那么为什么@RequestMapping displayList() 在代理中运行呢?原因是我的方法是私有的。如果我把 displayList() 变成一个公共方法,一切都很好。

于 2013-08-13T14:46:49.410 回答
1

一些想法:

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

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

  • 正如@coder 提到的,确保 bean 没有在您的 XML 上下文中声明

于 2013-08-09T20:32:06.910 回答