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

Hibernate中repository.save报NullPointerException但对象已存在的问题

解决Spring Boot中ExchangeRepository.save()空指针异常问题

这问题一看就是Spring依赖注入没到位导致的!控制台都已经显示Exchange对象创建和赋值完全正常,但调用exchangeRepository.save(e)时抛出空指针,说明你的exchangeRepository实例根本没被Spring初始化,处于null状态。

我帮你梳理下具体解决步骤:

1. 给MainController中的ExchangeRepository添加注入配置

你大概率是在MainController里只声明了exchangeRepository,但没让Spring帮你实例化它。两种常用注入方式任选其一:

方式一:@Autowired字段注入

@RestController
public class MainController {
    // 加上@Autowired注解,让Spring自动注入Repository实例
    @Autowired
    private ExchangeRepository exchangeRepository;

    @GetMapping(path = "addExchange")
    public @ResponseBody String addNewExchange (@RequestParam String exchange) {
        System.out.println("creating Exchange constructor");
        Exchange e = new Exchange();
        System.out.println("created exchange constructor, " + exchange);
        e.setE_name(exchange);
        System.out.println("Exchange name is, " + e.getE_name());
        System.out.println(e);
        // 此时exchangeRepository已被注入,不再是null
        exchangeRepository.save(e);
        return "Saved Exchange";
    }
}

方式二:构造函数注入(更推荐)

Spring 4.3+版本后,如果类只有一个构造函数,甚至可以省略@Autowired注解:

@RestController
public class MainController {
    private final ExchangeRepository exchangeRepository;

    // 通过构造函数注入,Spring会自动匹配并注入实例
    public MainController(ExchangeRepository exchangeRepository) {
        this.exchangeRepository = exchangeRepository;
    }

    // 你的接口方法代码...
}

2. 确保ExchangeRepository被Spring扫描到

检查你的Spring Boot主启动类(比如MoneyServicesApplication):

  • 如果ExchangeRepository和主启动类在同一个根包下(比如都在com.instantmoney.MoneyServices包内),Spring会自动扫描到Repository接口,无需额外配置;
  • 如果Repository在其他子包中,需要给主启动类添加@EnableJpaRepositories注解指定扫描路径:
@SpringBootApplication
@EnableJpaRepositories(basePackages = "com.instantmoney.MoneyServices.repositories") // 替换为你的Repository实际所在包路径
public class MoneyServicesApplication {
    public static void main(String[] args) {
        SpringApplication.run(MoneyServicesApplication.class, args);
    }
}

3. 确认实体类配置无遗漏

你的Exchange实体类已经添加了@Entity注解,ID字段也配置了@Id和@GeneratedValue,这部分是正确的。另外你能正常给对象赋值并获取属性值,说明getter/setter方法也没问题,这部分不用调整。

至于为什么其他类能正常运行?因为那些类里正确完成了Repository的注入操作,而你的MainController漏掉了这关键一步,导致Repository实例为null,调用save方法自然就触发空指针异常了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:23:46