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

emi*_*ele 2 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);
        ....
    }

}
Run Code Online (Sandbox Code Playgroud)

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

    User user = userRepository.getUserByUserName(userName);
Run Code Online (Sandbox Code Playgroud)

调试时,我看到userRepository确实为null.

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

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

谢谢!埃米尔.

emi*_*ele 6

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

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