先给解决方法:方法要改成public
错误代码:
@Controller
public class TestController {
@Autowired
private TestService testService;
@GetMapping("/test1")
public String test1(Model model){
model.addAttribute("tests1", testService.list());
return "test1";
}
@GetMapping("/test2")
private String test2(Model model){
model.addAttribute("tests2", testService.list());
return "test2";
}
}
注:在以上代码中,test1为public,test2为private
在访问/test1时,网页正常响应
在访问/test2时,服务器500
debug后,我发现,/test2中,testService注入后为null,而test1中正确注入了。找了好久才发现,是因为脑抽,把public写成private了。
这里有个小知识点:基于反射的调用方式,可以调用private方法!千万不要想当然地以为,只要从外部成功调用了方法,访问权限就没问题。
我查问题的时候看到了好多种其他的注入为null的情况:
- 没写@Service
- 手动new了对象
- @Service、@Componet、@Configuration、@Repository等Spring注解未被扫描到
- 在应用的Filter或Listener中使用了@Autowired
…
放个参考地址