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

Spring中@Service类调用Repository抛出NullPointerException问题

解决Spring中@Service类静态字段注入导致的NullPointerException问题

嗨,这个问题我之前在项目里踩过坑!你遇到的NullPointerException根本原因很明确:Spring的依赖注入机制无法给静态字段赋值,你的static UserDao userDao一直是null,调用它的方法自然就报错了。

为什么会出现这个问题?

Spring的依赖注入(DI)是基于实例对象的:容器会创建Utility类的实例Bean,然后给这个实例的非静态字段注入依赖。但静态字段属于类本身,不属于任何实例,Spring容器不会对静态字段进行注入操作,所以userDao始终是null。

解决方案1:去掉static修饰符(推荐)

这是最符合Spring设计理念的方案,把静态字段和静态方法都改成非静态的,让Spring正常管理依赖:

// 修改后的Utility.java
@Service 
public class Utility{
    @Autowired 
    private UserDao userDao; // 移除static修饰符

    public User findActiveUser(String auth){ // 方法也改成非静态
        System.out.println("here is the username: " + auth);
        User user = null;
        try {
            user = userDao.findBy...("user1", "ACTIVE"); 
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return user;
    }
}

你的Controller代码不需要改动,因为已经@Autowired了Utility的实例,直接调用非静态的findActiveUser方法即可。

这种方案的好处是:

  • 遵循Spring的依赖注入规范,便于容器管理Bean
  • 方便单元测试,可以轻松mock UserDao对象
  • 避免静态方法带来的耦合问题,代码更易维护

解决方案2:若必须用静态方法(不推荐)

如果因为某些原因一定要保留静态方法,可以通过构造器注入给静态字段赋值:

@Service 
public class Utility{
    private static UserDao userDao;

    // 用构造器注入UserDao,然后赋值给静态字段
    @Autowired
    public Utility(UserDao userDao) {
        Utility.userDao = userDao;
    }

    public static User findActiveUser(String auth){
        System.out.println("here is the username: " + auth);
        User user = null;
        try {
            user = Utility.userDao.findBy...("user1", "ACTIVE"); 
        }catch (Exception ex){
            ex.printStackTrace();
        }
        return user;
    }
}

不过这种方式不推荐,因为静态字段会让代码难以测试,也破坏了Spring的实例化管理逻辑,尽量避免使用。

总结

核心问题就是静态字段无法被Spring注入,优先选择去掉static的方案,让Spring正常管理你的Bean和依赖,这样就能解决NullPointerException了。

内容的提问来源于stack exchange,提问作者Blaze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 09:02:49