2015-07-20 8 views
8

में जावा संसाधन फ़ाइलों को पढ़ना मेरे पास Google AppEngine Java प्रोजेक्ट सेट अप है जो एक क्वेरी जॉब के परिणाम प्रदर्शित करने के लिए BigQuery को कॉल करता है। उदाहरण कोड और निर्देश मैंने उपयोग किया here पाया जा सकता है। ऐप मेरी विकास मशीन से क्वेरी चलाता है और पुनर्प्राप्त करता है, हालांकि जब मैं appspot.com पर परीक्षण करने के लिए AppEngine पर अपलोड करता हूं तो यह क्लाइंट_secrets.json फ़ाइल (जावा और URLpot.com के लिए अलग-अलग फ़ाइल जावास्क्रिप्ट यूआरएल प्राधिकरण के कारण) को लोड नहीं किया जा सकता है निम्नलिखित स्निपेट:Google AppEngine

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

client_secrets.json फ़ाइल मेरी युद्ध फ़ाइल में ठीक से पैक किया जाता है:

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 संसाधन फ़ाइल परिभाषा है। त्रुटि मैं मिलता है:

>/
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 को जोड़ता एक सर्वलेट वर्ग नहीं है, इसलिए इस कोड के कुछ पुनर्गठन की आवश्यकता होगी ठीक से लागू करने के लिए, और Google's instructions इंगित करता है कि मेरे कोड को काम करना चाहिए। हर प्रकार की सहायता का स्वागत है, धन्यवाद!

+0

देखें आप Maven/Gradle का उपयोग कर रहे हैं? यदि ऐसा है, तो फ़ाइल को src/main/संसाधन निर्देशिका में डालने पर विचार करें और इसे लोड करने का प्रयास करें @NamshubWriter – zaratustra

उत्तर

9

संसाधन फ़ाइलें फाइल सिस्टम पर नहीं हैं, इसलिए new File("/WEB-INF/client_secrets.json") साधारण काम नहीं करेगा। इसके बजाय, आप आमतौर पर एक संसाधन के रूप में लोड करने के लिए की जरूरत है:

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

किसी कारण से, AppEngine आप वर्ग लोडर का उपयोग कर वेब-INF के तहत संसाधनों के लोड नहीं दूँगी (आप ऊपर के साथ जार फ़ाइलों में संसाधनों लोड कर सकते हैं तकनीक)।

आप ऐप में वेब-आईएनएफ में पथों तक पहुंचने के लिए फ़ाइल एपीआई का उपयोग कर सकते हैं, लेकिन पथों को के सापेक्ष होने की आवश्यकता है। यह मानते हुए कि फ़ाइल client_secrets.jsonWEB-INF फ़ोल्डर में है, इस काम करना चाहिए:

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

File API का उपयोग करने के लिए वेब-INF के तहत संसाधनों को पढ़ने के लिए, आप भी भी को सुनिश्चित करें कि आपके appengine-web.xml फ़ाइल संसाधनों को शामिल करती है की जरूरत है अपने वेब-INF में:

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

Configuring appengine-web.xml और Why can't I read from this file

+0

त्वरित प्रतिक्रिया @NamshubWriter के लिए धन्यवाद। मैंने आपके द्वारा सुझाए गए परिवर्तन को लागू किया है, अब मुझे एक नई त्रुटि मिल रही है: सर्वलेट java.io.FileNotFoundException: /base/data/home/apps/s~tactile-reason-849/1.385858979910614152/WEB- INF/client_secrets.json (ऐसी कोई फ़ाइल या निर्देशिका नहीं) –

+0

@ChrisLumpkin आपका appengine-web.xml स्निपेट का तात्पर्य है कि यह फ़ाइल "कक्षाएं" के अंतर्गत है लेकिन आपका जावा कोड स्निपेट सीधे वेब-आईएनएफ के तहत इसे एक्सेस करने का प्रयास कर रहा है। यह संसाधन कहां है? क्या यह आपकी जार फ़ाइलों में से एक से आता है? क्या आप अपनी WAR फ़ाइल में यह देखने के लिए देख सकते हैं कि यह कहां है? – NamshubWriter

+0

मैंने अपने द्वारा किए गए परिवर्तनों को दर्शाने के लिए उपरोक्त स्निपेट को अपडेट किया है। युद्ध फ़ाइल में वेब-आईएनएफ/client_secrets.json है। –