Spring Boot整合MongoDB不通过RestApi实现定时插入数据问题咨询
空指针报错根因
- 你手动通过
new Manager()创建的实例不受Spring IoC容器托管,@Autowired注解仅对Spring容器管理的Bean生效,因此Manager里的StockController没有被自动赋值,调用时就会抛出空指针异常 - 额外优化建议:Controller是专门处理Web请求的层组件,定时调度场景完全没有必要绕一层Controller调用,直接注入StockService执行业务逻辑更合理
实现方案
临时测试直接调用逻辑
如果只是要实现启动后立即执行一次数据保存,按下面修改即可:
- 将Manager注册为Spring Bean,直接注入StockService
@Component public class Manager { @Autowired private StockService stockService; public boolean test(){ LocalDateTime date = LocalDateTime.now(); Stock stock = new Stock((double)500, "Test",date); stockService.saveStock(stock); System.out.println("stock saved"); return true; } }
- 修改启动类,从Spring上下文获取Manager实例执行
@SpringBootApplication public class ApiReaderApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(ApiReaderApplication.class, args); // 从Spring容器拿托管的Manager实例 Manager manager = context.getBean(Manager.class); manager.test(); } }
定时任务实现(核心需求)
Spring自带定时任务组件,无需引入额外依赖,几步就能实现:
- 启动类添加
@EnableScheduling注解开启定时任务功能 - 直接在启动类或任意Spring托管的Bean中添加带
@Scheduled注解的方法,配置执行周期即可
@SpringBootApplication @EnableScheduling public class ApiReaderApplication { @Autowired private StockService stockService; public static void main(String[] args) { SpringApplication.run(ApiReaderApplication.class, args); } // 示例:每10秒执行一次数据保存,fixedRate单位为毫秒 @Scheduled(fixedRate = 10000) public void autoSaveStock() { LocalDateTime date = LocalDateTime.now(); Stock stock = new Stock((double)500, "Test",date); stockService.saveStock(stock); System.out.println("定时任务执行完成,stock已保存"); } }
如果需要自定义执行时间,可以使用cron表达式配置,例如每天凌晨1点执行可配置为@Scheduled(cron = "0 0 1 * * ?")
内容的提问来源于stack exchange,提问作者MatiasGSP
相关产品推荐
相关产品推荐

