You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:20:32