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

无法创建firestoreTemplate Bean,Spring Boot集成Firestore报错求助

问题描述

运行Spring Boot应用时抛出错误:

Field textbookRepository in com.uga.backend.controller.TextbookController required a bean named 'firestoreTemplate' that could not be found.

已在application.properties中配置Firebase参数,主类添加了@EnableReactiveFirestoreRepositories注解,但错误仍未解决,也不清楚如何手动创建firestoreTemplate Bean。


相关代码

TextbookRepository.java

package com.uga.backend.repository;

import org.springframework.cloud.gcp.data.firestore.FirestoreReactiveRepository;
import org.springframework.stereotype.Repository;

import com.uga.backend.entity.Textbook;

@Repository("textbookRepository")
public interface TextbookRepository extends FirestoreReactiveRepository<Textbook> {

}

TextbookController.java

package com.uga.backend.controller;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.uga.backend.entity.Textbook;
import com.uga.backend.repository.TextbookRepository;

@RestController
@RequestMapping("/api/textbooks")
public class TextbookController {

    @Autowired
    TextbookRepository textbookRepository;

    @PostMapping("/save")
    public Mono<Textbook> save(@RequestBody Textbook textbook) {
        return this.textbookRepository.save(textbook);
    }

    @GetMapping("/get")
    public Mono<Textbook> getById(@RequestParam String id) {
        return this.textbookRepository.findById(id);
    }

    @GetMapping("/getAll")
    public Flux<Textbook> getAll() {
        return this.textbookRepository.findAll();
    }

    @DeleteMapping("/delete")
    public Mono<Void> delete(String id) {
        return this.textbookRepository.deleteById(id);
    }

}

BackendApplication.java

package com.uga.backend;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gcp.data.firestore.repository.config.EnableReactiveFirestoreRepositories;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@EnableReactiveFirestoreRepositories("com.uga.backend.repository")
@ComponentScan("com.uga.backend.controllers")
public class BackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(BackendApplication.class, args);
    }
}

application.properties

spring.cloud.gcp.firestore.project-id=project-id
spring.cloud.gcp.firestore.credentials.location=file:./serviceAccount.json
spring.cloud.gcp.firestore.enabled=true
spring.cloud.gcp.firestore.auto-create-indices=true

解决方案

1. 补全依赖

确保项目依赖中包含Spring Cloud GCP Firestore的Reactive相关包:

Maven 依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-starter-data-firestore</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-data-firestore-reactive</artifactId>
</dependency>

Gradle 依赖

implementation 'org.springframework.cloud:spring-cloud-gcp-starter-data-firestore'
implementation 'org.springframework.cloud:spring-cloud-gcp-data-firestore-reactive'

2. 修复组件扫描路径

主类中@ComponentScan指定的com.uga.backend.controllers是复数,但实际控制器所在包是com.uga.backend.controller(单数),导致控制器无法被正确扫描。可以:

  • 修改路径为正确的包名:@ComponentScan("com.uga.backend.controller")
  • 或者直接移除@ComponentScan,因为@SpringBootApplication默认会扫描主类所在包及其子包,足够覆盖控制器和仓库类。

3. 手动配置FirestoreTemplate Bean

若自动配置失效,可手动创建相关Bean:

package com.uga.backend.config;

import com.google.cloud.firestore.Firestore;
import com.google.cloud.firestore.FirestoreOptions;
import org.springframework.cloud.gcp.data.firestore.FirestoreTemplate;
import org.springframework.cloud.gcp.data.firestore.ReactiveFirestoreTemplate;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.FileInputStream;
import java.io.IOException;

@Configuration
public class FirestoreConfig {

    @Bean
    public Firestore firestore() throws IOException {
        // 加载指定的密钥文件
        FileInputStream serviceAccount = new FileInputStream("./serviceAccount.json");
        return FirestoreOptions.newBuilder()
                .setCredentials(com.google.auth.oauth2.ServiceAccountCredentials.fromStream(serviceAccount))
                .setProjectId("project-id")
                .build()
                .getService();
    }

    @Bean
    public FirestoreTemplate firestoreTemplate(Firestore firestore) {
        return new FirestoreTemplate(firestore);
    }

    @Bean
    public ReactiveFirestoreTemplate reactiveFirestoreTemplate(Firestore firestore) {
        return new ReactiveFirestoreTemplate(firestore);
    }
}

4. 验证Firebase配置有效性

  • 确认serviceAccount.json路径正确,文件存在且权限正常
  • 检查project-id与Firebase控制台的项目ID完全一致
  • 可通过简单代码测试连接:
Firestore db = FirestoreOptions.getDefaultInstance().getService();
ApiFuture<DocumentSnapshot> future = db.collection("textbooks").document("test").get();
DocumentSnapshot document = future.get();
System.out.println("Document data: " + document.getData());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 14:43:14