我有一个非常简单和经典的页面,带有一个 Spring MVC Controller 和一个 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 行的 Controller 中抛出 NullPointeurException。
User user = userRepository.getUserByUserName(userName);
调试的时候发现userRepository确实是null。
userRepository 应该由 Spring 注入(inject),在我所有其他 Controller 中,它发生得很好:相同的 bean (userRepository) 由 Spstring 正确注入(inject)。
为什么在这个由 Spring 实例化和调用的特定 Controller (与所有其他 Controller 位于同一包中)中,userRepository 为空? 我完全不明白。欢迎提出任何建议。
谢谢! 埃米尔。
请您参考如下方法:
当我这样做时,我找到了答案:我在 Controller 中创建了一个@PostConstruct 方法,以查看是否在开始时注入(inject)了userRepository。事实上,@PostConstruct 方法运行时,userRepository 不为空。在调试我的方法时,我发现对象的 id (在 eclipse 的 View 变量中)为 307。此外,在调试 displayList 方法时,“this”显示了一个代理。所以,看起来 @postconstruct 方法 test () 在 bean 中运行,而 @RequestMapping displayList 方法在代理中运行。在代理中,userRepository 将为空。
那么为什么@RequestMapping displayList() 在代理中运行呢? 原因是我的方法是私有(private)的。如果我将 displayList() 转换为公共(public)方法,一切正常。