2012-04-10 51 views
1

我想在Clojure中構建一個簡單的Web部件,它應該獲取Picasa提要,從那裏檢索縮略圖URL並返回將插入到頁面的HTML(使用JQuery AJAX調用)。 Picasa資訊提供有一個https:// ...網址。 當我在使用mvn的本地Jetty實例中運行時,一切正常。jetty:run;但是,當我嘗試在本地GAE實例(mvn gae:run)中運行時,它失敗並出現AccessControlException。 我已閱讀GAE文檔,但是這表明對於來自Java的URLFetch,應該只使用普通的Java URLConnection類,其中Google將提供它們自己的實現。據我所知,我正在按照他們的例子來寫這封信,只使用Clojure/Java interop。從Clojure調用的App Engine URLFetch服務給出AccessControlException

谷歌示例代碼如下所示:

import java.net.URL; 
// (other imports omitted) 
try { 
    URL url = new URL("http://www.example.com/atom.xml"); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 
    String line; 
    while ((line = reader.readLine()) != null) { 
     // ... 
    } 

有趣的是,這是在URL直接調用的OpenStream雖然其他地方的文件中提到要使用的URLConnection。我試過兩種,但結果是一樣的。 我相應的Clojure代碼,使用的openConnection:

(if (.startsWith str-url "https://picasaweb.google.com") 
    (let [feed-url (java.net.URL. str-url) 
      connection (.openConnection feed-url) 
      xmltags (xml-seq (parse (.openStream connection)))] 
    ; ... 

當我運行這個在GAE我得到以下堆棧跟蹤底部(截)

java.lang.ExceptionInInitializerError 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at java.lang.Class.newInstance0(Class.java:355) 
    at java.lang.Class.newInstance(Class.java:308) 
    at org.mortbay.jetty.servlet.Holder.newInstance(Holder.java:153) 
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:428) 
    at org.mortbay.jetty.servlet.ServletHolder.getServlet(ServletHolder.java:339) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.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 com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122) 

最後:

Caused by: java.security.AccessControlException: access denied  (java.security.SecurityPermission getProperty.ssl.KeyManagerFactory.algorithm) 
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374) 
    at java.security.AccessController.checkPermission(AccessController.java:546) 
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) 
    at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:252) 
    at java.security.Security.getProperty(Security.java:725) 
    at org.eclipse.jetty.util.ssl.SslContextFactory.<clinit>(SslContextFactory.java:92) 
    ... 74 more 

我一直在谷歌搜索,看看是否有任何設置,我應該添加在appengine-web.xml或其他地方,但我什麼都看不到。我讀的所有內容都告訴我這應該「只是工作」,但事實並非如此。 任何建議是最受歡迎的;如果需要,我可以發佈完整的源代碼或完整的堆棧跟蹤,但我認爲上述內容幾乎是相關的部分。

回答

0

openStream()openConnection().getInputStream()的簡寫,其中openConnection()返回URLConnection

相關問題