首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Google AppEngine中读取Java资源文件

在Google AppEngine中读取Java资源文件
EN

Stack Overflow用户
提问于 2015-07-20 08:25:59
回答 2查看 4.8K关注 0票数 10

我有一个Google项目,它调用BigQuery来显示查询作业的结果。我使用的示例代码和指令可以在here中找到。应用程序运行并从我的开发机器上检索查询,但是当我上传到AppEngine并在appspot.com上测试时,它显示client_secrets.json文件(由于JavaScript URL授权,dev和appspot.com的文件不同)无法使用以下代码片段加载:

代码语言:javascript
复制
  static GoogleClientSecrets getClientCredential() throws IOException {
if (clientSecrets == null) {

    clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
            new InputStreamReader(new FileInputStream(
                new File("WEB-INF/client_secrets.json"))));

  Preconditions.checkArgument(!clientSecrets.getDetails().getClientId().startsWith("Enter ")
      && !clientSecrets.getDetails().getClientSecret().startsWith("Enter "),
      "Enter Client ID and Secret from https://code.google.com/apis/console/?api=bigquery "
      + "into bigquery-appengine-sample/src/main/resources/client_secrets.json");
}
return clientSecrets;

}

下面是我的appengine-web.xml资源文件定义:

代码语言:javascript
复制
  <resource-files>
    <include path="**" />
  </resource-files>

client_secrets.json文件已正确打包到我的war文件中。我得到的错误是:

代码语言:javascript
复制
> /
Uncaught exception from servlet
java.io.FileNotFoundException: /base/data/home/apps/s~tactile-reason-849/1.385872137632330782/WEB-INF/client_secrets.json (No such file or directory)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:171)
    at com.google.api.client.sample.bigquery.appengine.dashboard.ServiceUtils.getClientCredential(ServiceUtils.java:71)
    at com.google.api.client.sample.bigquery.appengine.dashboard.ServiceUtils.newFlow(ServiceUtils.java:103)
    at com.google.api.client.sample.bigquery.appengine.dashboard.MainServlet.initializeFlow(MainServlet.java:125)
    at com.google.api.client.extensions.servlet.auth.oauth2.AbstractAuthorizationCodeServlet.service(AbstractAuthorizationCodeServlet.java:124)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.JdbcMySqlConnectionCleanupFilter.doFilter(JdbcMySqlConnectionCleanupFilter.java:60)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:257)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146)
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:482)
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:437)
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:444)
    at com.google.tracing.CurrentContext.runInContext(CurrentContext.java:230)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:308)
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:300)
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:441)
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:234)
    at java.lang.Thread.run(Thread.java:745)

我可以尝试使用ServletContext.getResourceAsStream(),但是示例应用程序中连接到BigQuery的类不是Servlet类,因此这将需要对代码进行一些重组才能正确实现,Google's instructions似乎表明我的代码应该可以工作。感谢您的帮助,谢谢!

EN

回答 2

Stack Overflow用户

发布于 2015-07-20 08:40:21

资源文件不在文件系统上,所以普通的new File("/WEB-INF/client_secrets.json")不能工作。相反,您通常需要将其作为资源加载:

代码语言:javascript
复制
InputStream resourceStream = Thread.currentThread().getContextClassLoader()
    .getResourceAsStream("/WEB-INF/client_secrets.json");

由于某些原因,AppEngine不允许您使用类加载器加载WEB-INF下的资源(您可以使用上面的技术在jar文件中加载资源)。

您可以使用File接口访问App中WEB-INF中的路径,但路径需要是相对的。假设文件client_secrets.jsonWEB-INF文件夹中,这应该是可行的:

代码语言:javascript
复制
clientSecrets = GoogleClientSecrets.load(JSON_FACTORY,
    new InputStreamReader(new FileInputStream(
        new File("WEB-INF/client_secrets.json"))));

要使用WEB appengine-web.xml 读取WEB-INF下的资源,还需要确保您的API文件在WEB-INF中包含资源:

代码语言:javascript
复制
<resource-files>
  <include path="/**.json" />
</resource-files>

请参阅Configuring appengine-web.xmlWhy can't I read from this file

票数 10
EN

Stack Overflow用户

发布于 2018-08-01 14:56:50

为了解决AppEngine的错误,我创建了一个对象,其中包含我从FirebaseCredentialsHelper类构建的Firebase身份验证数据。返回的对象使用从Firebase控制台生成的字符串值。

然后,我使用Gson library将FirebaseCredentialsHelper类返回的身份验证对象转换为json,然后转换为字节输入流。

代码语言:javascript
复制
FirebaseApp.initializeApp(FirebaseOptions.Builder()
.setCredentials(GoogleCredentials.fromStream(Gson().toJson(FirebaseCredentialsHelper.get()).byteInputStream()))
.build()) 

注意:我没有对Firebase身份验证对象进行版本控制,因为它们包含私有信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31507370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档