我有一个非常简单和经典的页面,带有一个 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)方法,一切正常。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!