微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法在春季启动中初始化Firebase Auth

如何解决无法在春季启动中初始化Firebase Auth

我在我的Spring Boot应用程序中使用firebase admin sdk。 (API应用)

当我在本地运行时,它的工作正常。但是当部署到tomcat时,它给了我NPE。

在Springboot应用程序中

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

    try {
        ClassLoader classloader = Thread.currentThread().getContextClassLoader();

        File file = new File(classloader.getResource("firebase2.json").getFile());
        logger.info("FILE PATH : " + file.getAbsolutePath());
        FileInputStream serviceAccount = new FileInputStream(file.getAbsolutePath());

        FirebaSEOptions options = new FirebaSEOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl(FB_BASE_URL)
                .build();

        firebaseApp = FirebaseApp.initializeApp(options);
        logger.info("FIREBASE NAME : "+firebaseApp.getName());
    } catch (IOException e) {
        e.printstacktrace();
    }
}

使用API​​代码

userRecord = FirebaseAuth.getInstance(InfanoApplication.firebaseApp).getUserByPhoneNumber(mobile);

错误

java.lang.NullPointerException
at com.google.firebase.ImplFirebaseTrampolines.getService(ImplFirebaseTrampolines.java:62)
at com.google.firebase.auth.FirebaseAuth.getInstance(FirebaseAuth.java:101)

有人可以帮助解决此问题。预先谢谢你。

解决方法

您不应在main方法中创建这样的Firebase实例。可能在正确的类路径中找不到您的服务帐户。我将创建一个Spring Configuration,它会在应用程序启动时创建一个Firebase应用程序。我已将服务帐户保存在 resources文件夹的根目录 中。

@Configuration
public class FirebaseConfig {

    //TODO: In your case maybe something else
    @Value(value = "classpath:serviceAccount.json")
    private Resource serviceAccountResource;

    @Bean
    public FirebaseApp createFireBaseApp() throws IOException {
        InputStream serviceAccount = serviceAccountResource.getInputStream();

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("<db-url>")
                .setStorageBucket("<storage-url>")
                .build();

        //Add loggers
        System.out.println("Firebase config initialized");

        return FirebaseApp.initializeApp(options);
    }

    
    @Bean
    @DependsOn(value = "createFireBaseApp")
    public StorageClient createFirebaseStorage() {
        return StorageClient.getInstance();
    }

    @Bean
    @DependsOn(value = "createFireBaseApp")
    public FirebaseAuth createFirebaseAuth() {
        return FirebaseAuth.getInstance();
    }

    @Bean
    @DependsOn(value = "createFireBaseApp")
    public FirebaseDatabase createFirebaseDatabase() {
        return FirebaseDatabase.getInstance();
    }

    @Bean
    @DependsOn(value = "createFireBaseApp")
    public FirebaseMessaging createFirebaseMessaging() {
        return FirebaseMessaging.getInstance();
    }
}

现在,如果我想在任何服务类中使用Firebase Auth,则只需执行以下操作:

@Service
class MyService {

    @Autowired
    private FirebaseAuth firebaseAuth;

    //TODO: Probably should have return type
    public void findUser(String mobile) {
        firebaseAuth.getUserByPhoneNumber(mobile);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?