如何解决无法在春季启动中初始化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 举报,一经查实,本站将立刻删除。