Spring Boot整合MongoDB启动失败:缺失LogRecordCollection类型Bean
报错根因
- 核心错误:
com.bezkoder.spring.jwt.mongodb.models.LogRecordCollection未被注册为Spring Bean,Spring容器中不存在该类型的实例,导致构造器注入失败。 - 你当前的
LogRecordCollection类既没有添加@Component/@Service等Spring组件注册注解,也没有在配置类中手动声明对应的Bean,因此无法被注入。
现有代码的功能性缺陷(即使解决启动报错也无法正常实现需求)
LogRecordCollection使用静态变量collectionName存储集合名,全局共享的属性会导致多文件并发处理时集合名被互相覆盖,完全不符合“每个流量文件对应独立Mongo集合”的需求。- Spring Data MongoDB的
MongoRepository默认绑定固定集合名,你当前即使手动设置了collectionName,LogRecordRepository仍然只会操作默认的logRecord集合,不会切换到指定的独立集合。 - 若全部使用动态集合操作,原有的
LogRecordRepository属于冗余代码。
完整修复方案(推荐,适配你的动态分集合需求)
1. 移除无效的自定义LogRecordCollection类
直接删除该类,改用Spring Data MongoDB提供的MongoTemplate实现动态集合操作,它原生支持运行时指定集合名执行增删查改。
2. 改造启动类SpringBootSecurityJwtMongodbApplication
调整构造器与成员变量
删除原构造器中对LogRecordCollection的依赖,替换为注入MongoTemplate:
// 改造后的构造器 public SpringBootSecurityJwtMongodbApplication(LogFileRepository logfileRepo, MongoTemplate mongoTemplate) { this.logfileRepo = logfileRepo; this.mongoTemplate = mongoTemplate; } // 对应的成员变量替换为 private final LogFileRepository logfileRepo; private final MongoTemplate mongoTemplate;
调整数据写入逻辑
替换原解析后写入的逻辑,使用MongoTemplate指定动态集合名存储解析结果:
// 替换原logrecordColl相关的无效代码 mongoTemplate.insert(listdata, collectionName);
3. 改造查询接口LogRecordController
删除原Controller中手动新建LogRecordCollection的无效逻辑,使用MongoTemplate按传入的fileId查询对应集合的数据:
@GetMapping("") public ResponseEntity<?> getAllLogRecordsByLogFileId(@RequestParam("fileId") String fileId) { try{ // 直接查询fileId对应的独立集合 List<LogRecord> logRecords = mongoTemplate.query(LogRecord.class) .collection(fileId) .with(Sort.by(Sort.Direction.ASC, "no")) .all(); return ResponseEntity.ok().body(logRecords); }catch (Exception e){ return ResponseEntity.status(HttpStatus.EXPECTATION_FAILED).body(e.getMessage()); } }
注意:如果需要分页查询,可以在链式调用中追加pageable(PageRequest.of(page, size))参数。
临时启动方案(不推荐生产使用)
如果仅需临时跳过启动报错,可以给LogRecordCollection类添加@Component注解,让Spring扫描注册Bean,但由于静态变量全局共享的问题,多文件处理时会出现集合名错乱的bug,仅适合本地测试。
内容的提问来源于stack exchange,提问作者user11725933
相关产品推荐
相关产品推荐

