1

Picasa フィードをフェッチし、そこからサムネイル URL を取得し、ページに挿入される HTML を返す必要がある単純な Web ウィジェットを Clojure で構築しようとしています (JQuery AJAX 呼び出しを使用)。Picasa フィードには https://... URL があります。mvn jetty:run を使用してローカルの Jetty インスタンスで実行すると、すべてが機能します。ただし、ローカルの GAE インスタンス (mvn gae:run) で実行しようとすると、AccessControlException で失敗します。私は GAE のドキュメントを読みましたが、Java からの URLFetch では、Google が独自の実装を提供する通常の Java URLConnection クラスを使用する必要があると記載されています。私が見る限り、Clojure/Java 相互運用のみを使用して、彼らの例に従っています。

Google のコード例は次のようになります。

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 の使用について言及されています。両方試しましたが、結果は同じです。openConnection を使用した、対応する Clojure コード:

  (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 または他の場所に追加する必要がある設定があるかどうかをグーグルで調べましたが、何も表示されません。私が読んだものはすべて、これは「うまくいく」はずだと言っていますが、そうではありません。どんなアドバイスでも大歓迎です。必要に応じて、完全なソースまたは完全なスタックトレースを投稿できますが、上記はほとんど関連する部分だと思います。

4

1 に答える 1