gpt4 book ai didi

java - 在 Google AppEngine 中读取 Java 资源文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:57:01 24 4
gpt4 key购买 nike

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

  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 资源文件定义:

  <resource-files>
<include path="**" />
</resource-files>

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

> /
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似乎表明我的代码应该工作。感谢任何帮助,谢谢!

最佳答案

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

InputStream resourceStream = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("/WEB-INF/client_secrets.json");

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

您可以在App中使用File API访问WEB-INF中的路径,但路径需要是相对的。假设文件 client_secrets.json 位于 WEB-INF 文件夹中,这应该有效:

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

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

<resource-files>
<include path="/**.json" />
</resource-files>

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

关于java - 在 Google AppEngine 中读取 Java 资源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31507370/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com