【问题标题】:Get Resource URL Path in Java Spring在 Java Spring 中获取资源 URL 路径
【发布时间】:2016-11-08 13:35:02
【问题描述】:

试图获取我的资源文件夹中的 JSON 文件的路径,但使用 getResource().getPath() 未能这样做。我希望以尽可能可靠的方式获取此 URL。

public static void initializeFirebase() {
        try {
            URL url = getResource("google-services.json");
            System.out.println(url.getPath());
            FirebaseOptions options = new FirebaseOptions
                    .Builder()
                    .setServiceAccount(new FileInputStream(url.getPath()))
                    .setDatabaseUrl("https://XXXXX.firebaseio.com/")
                    .build();
            FirebaseApp.initializeApp(options);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

上面的函数打印: /Users/username/Documents/Spring_Project/springbackend/build/resources/main/google-services.json 在抛出错误之前:

Exception in thread "main" java.lang.RuntimeException: Failed to read service account
    at com.google.firebase.FirebaseOptions$Builder.setServiceAccount(FirebaseOptions.java:82)
    at live.cibc.labs.springbackend.SpringbackendApplication.initializeFirebase(SpringbackendApplication.java:188)
    at live.cibc.labs.springbackend.SpringbackendApplication.main(SpringbackendApplication.java:61)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: org.json.JSONException: JSONObject["project_id"] not found.

显然它找不到我的 project_id,因为我的 google-services.json 在 src/main/resources/google-services.json 下。

我应该如何获取路径尽可能健壮的方式?

google-services.json

{
  "project_info": {
    "project_number": "XXXXXXXX",
    "firebase_url": "https://XXXXXX.firebaseio.com",
    "project_id": "XXXX-XXX",
    "storage_bucket": "XXXXXXXX.appspot.com"
  },
  "client": [
    {
      "client_info": {
        "mobilesdk_app_id": "1:XXXXXXXXX:android:XXXXXXX",
        "android_client_info": {
          "package_name": "my.spring.project"
        }
      },
      "oauth_client": [
        {
          "client_id": "XXXXX-XXXXX.apps.googleusercontent.com",
          "client_type": 3
        }
      ],
      "api_key": [
        {
          "current_key": "XXXXXX"
        }
      ],
      "services": {
        "analytics_service": {
          "status": 1
        },
        "appinvite_service": {
          "status": 1,
          "other_platform_oauth_client": []
        },
        "ads_service": {
          "status": 2
        }
      }
    }
  ],
  "configuration_version": "1"
}

【问题讨论】:

  • 您的google-services.json 只是在您的类路径的根目录中。当您的应用程序运行时,不再有src/main/resources。您正在使用 Spring,然后使用它。只需使用Resource res = new ClassPathResource("google-services.json") 即可获得。然后在需要时执行res.getInputStream()。不要试图自己做这些事情。你也可以@AutowireResourceLoaderResource res=resourceLoader.getResource("classpath:/google-services-json"); 并按照前面提到的那样继续。
  • resourceLoader.getResource("classpath:/google-services-j‌​son");resourceLoader.getResource("google-services-j‌​son"); 都返回 null
  • 当然...您可能想检查该代码,而不是复制粘贴(我们也会出错)...这显然不是您的文件名...
  • 如果您指的是google-services-json,我确实修改了您的错误,但无济于事。 getResource("google-services.j‌​son") 为空,getResource("classpath:/google-services.j​so‌​n"); 抛出 JSON 读取失败异常
  • 那么它确实存在并且您的 JSOn 不是您的 API 所期望的。如果文件不存在,则为null

标签: java spring firebase path


【解决方案1】:

答案最终对我来说真的很愚蠢!在 Firebase 控制台中,您可以下载 2 个 JSON 文件。

  • google-services.json 是给客户的
  • service-account-credentials.json 用于服务器管理 SDK(我应该一直使用的那个)

不要把两者混为一谈!

【讨论】:

    【解决方案2】:

    如果我理解正确,您使用的是 Spring,那么最好的方法是使用 Springs ClassPathResource

    public static void initializeFirebase() {    
      try {
          Resource googleServicesResource = new ClassPathResource("google-services.json");
          FirebaseOptions options = new FirebaseOptions
                  .Builder()
                  .setServiceAccount(googleServicesResource.getInputStream())
                  .setDatabaseUrl("https://XXXXX.firebaseio.com/")
                  .build();
          FirebaseApp.initializeApp(options);
      } catch (IOException e) {
          e.printStackTrace();
      }
    }
    

    【讨论】:

    • 仍然遇到同样的问题:Exception in thread "main" java.lang.RuntimeException: Failed to read service accountCaused by: org.json.JSONException: JSONObject["project_id"] not found. 因为找不到文件
    • 你能提供json吗?可能是格式不正确。 json 键已被引用。
    • 已发布,尽管这不太可能,因为它是直接从我的 firebase 控制台下载的,没有经过修改。
    猜你喜欢
    • 2013-01-06
    • 1970-01-01
    • 2011-09-12
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2010-10-30
    • 2012-05-13
    相关资源
    最近更新 更多