Spring初始化baseController bean失败抛出java.lang.NullPointerException问题求助
空指针异常原因
- 核心问题出在Bean初始化顺序冲突:
@PostConstruct注解的方法会在当前类的依赖注入完成后立刻执行,此时Spring上下文还未完全初始化完成,HomeServiceIml内部依赖的组件(比如数据层Mapper、数据库连接池等)可能还没完成注入和初始化,调用GetDataMenus方法时用到这些未初始化的属性就会抛出空指针。 - 次要问题:
BaseController加了@Controller注解,它的子类HomeController也加了@Controller注解,Spring会同时创建父子类两个控制器Bean,触发两次@PostConstruct执行,进一步提高了初始化冲突的概率。 - 额外可能:
HomeServiceIml的GetDataMenus方法33行本身存在未判空的逻辑,比如直接访问空对象的属性或方法。
修复方案
- 移除
BaseController上的@Controller注解,它仅作为公共父类使用,不需要被Spring单独实例化:
// 去掉@Controller注解 public class BaseController { @Autowired protected HomeServiceIml _homeService; // 移除@PostConstruct的Init方法,不要在这里注入公共视图数据 }
- 改用Spring官方推荐的
@ControllerAdvice+@ModelAttribute方案注入全局公共视图属性,替代原来的_mvShare方案,避免初始化顺序问题:
@ControllerAdvice public class GlobalViewDataConfig { @Autowired private HomeServiceIml _homeService; // 该属性会自动注入到所有控制器的视图中,视图层直接使用menus变量即可 @ModelAttribute("menus") public List<Menu> initMenus() { // 替换返回值为你实际的菜单数据类型 return _homeService.GetDataMenus(); } }
- 检查
HomeServiceIml类GetDataMenus方法第33行的代码,对所有可能为空的对象增加判空逻辑,同时确认该Service内部依赖的所有组件都已经正确添加了注入注解(比如@Autowired、@Resource)。
内容的提问来源于stack exchange,提问作者Timmi
相关产品推荐
相关产品推荐

