Glassfish部署Jakarta JAX-RS API调用Firestore遇No route to host错误求助
解决Glassfish部署JAX-RS API调用Firestore时的"No route to host"问题
一、先修正Firebase初始化逻辑(避免重复初始化+资源浪费)
你的代码在每次请求端点时都会重新初始化FirebaseApp,这不仅效率低下,还可能引发重复初始化异常,先把初始化逻辑移到应用启动时执行:
1. 创建启动时初始化的Singleton Bean
import jakarta.annotation.PostConstruct; import jakarta.ejb.Singleton; import jakarta.ejb.Startup; import com.google.auth.oauth2.GoogleCredentials; import com.google.firebase.FirebaseApp; import com.google.firebase.FirebaseOptions; import java.io.IOException; import java.io.InputStream; @Singleton @Startup public class FirebaseBootstrap { @PostConstruct public void initFirebase() throws IOException { // 仅在没有已初始化的FirebaseApp时执行初始化 if (FirebaseApp.getApps().isEmpty()) { // 从类路径读取密钥文件(推荐方式,避免路径问题) InputStream serviceAccount = getClass().getResourceAsStream("/serviceAccountKey.json"); FirebaseOptions options = new FirebaseOptions.Builder() .setCredentials(GoogleCredentials.fromStream(serviceAccount)) .build(); FirebaseApp.initializeApp(options); } } }
2. 简化端点方法
@GET @Path("/alive") @Produces("text/plain") public String alive() throws ExecutionException, InterruptedException { Firestore dbFirestore = FirestoreClient.getFirestore(); DocumentReference docRef = dbFirestore.collection("drivers").document("8QM7cdz8zOoafQSIHFsd"); ApiFuture<DocumentSnapshot> future = docRef.get(); DocumentSnapshot document = future.get(); return document.exists() ? document.getData().toString() : "No such document!"; }
二、排查网络连通性问题(核心原因)
本地正常但服务器报错,大概率是服务器网络无法访问Firestore服务:
测试服务器网络连通性:
在服务器终端执行以下命令,确认能访问Firestore的服务地址:ping firestore.googleapis.com # 或测试HTTPS端口 telnet firestore.googleapis.com 443如果无法连通,说明网络存在阻塞。
配置代理(若服务器在企业内网):
如果服务器需要通过代理访问外网,在Glassfish的启动参数中添加代理配置:-Dhttps.proxyHost=你的代理IP -Dhttps.proxyPort=代理端口若代理需要认证,追加:
-Dhttps.proxyUser=代理用户名 -Dhttps.proxyPassword=代理密码可在Glassfish的
domain.xml中修改jvm-options节点添加上述参数。检查防火墙/安全组规则:
确认服务器所在环境的防火墙、云服务商安全组允许**出站HTTPS(443端口)**访问firestore.googleapis.com,或者允许访问Google Cloud API的IP段。
三、确认密钥文件路径正确性
如果服务器上找不到serviceAccountKey.json,也可能间接导致网络请求失败(初始化失败):
- 将
serviceAccountKey.json放在Maven/Gradle项目的src/main/resources目录下,打包后会自动进入WAR的WEB-INF/classes路径 - 使用类加载器读取文件(如上述初始化代码中的
getResourceAsStream),避免依赖绝对路径导致的文件找不到问题
内容的提问来源于stack exchange,提问作者Luigi Schiavone
相关产品推荐
相关产品推荐

