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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:35:22