Spring控制器部分方法Autowired字段空指针异常求助
问题原因及解决方案
核心问题
你的save和delete方法使用了private访问修饰符,这既违反Spring MVC规范,又和新增的AOP支持冲突,导致依赖注入失效:
- Spring MVC需通过反射调用控制器的请求处理方法,
private方法无法被Spring代理类拦截调用,请求触发这些方法时,执行的是原始类的方法而非Spring管理的代理实例,此时@Autowired注入的customerService未被初始化,因此抛出NullPointerException。 - 新增的AOP依赖会让Spring用代理类增强控制器方法,但不管是JDK动态代理还是CGLIB代理,都无法对
private方法做代理增强,进一步放大了问题。 listCustomers方法是public的,Spring能正常生成代理并注入依赖,所以没有异常。
解决方案
将save和delete方法的访问修饰符改为public即可:
@Controller @RequestMapping("/customer") public class CustomerController { @Autowired private CustomerService customerService; @GetMapping("/list") public String listCustomers(Model model) { List<Customer> customers = customerService.getCustomers(); model.addAttribute("customers", customers); return "list-customer"; } @PostMapping("/save") // 修改为public public String save(@ModelAttribute("customer") Customer customer) { customerService.saveCustomer(customer); return "redirect:/customer/list"; } @GetMapping("/delete") // 修改为public public String delete(@RequestParam("customerId") int id, Model model) { customerService.removeCustomer(customerService.getCustomer(id)); return "redirect:/customer/list"; } }
额外说明
Spring框架中,所有需要被容器管理或拦截的方法(包括控制器请求方法、AOP增强方法)都必须是public,或至少是protected(仅CGLIB代理支持),private方法会绕过Spring的代理机制,导致依赖注入、AOP增强等功能失效。
内容的提问来源于stack exchange,提问作者HamidYari
相关产品推荐
相关产品推荐

