ClojureでPicasaフィードを取得し、そこからサムネイルURLを取得し、ページに挿入されるHTMLを返す単純なWebウィジェットを作成しようとしています。 JQuery AJAX呼び出し)。 Picasaフィードにはhttps:// ...のURLがあります。 すべては、mvn jettyを使ってローカルのJettyインスタンスで実行すると動作します。しかし、ローカルのGAEインスタンス(mvn gae:run)で実行しようとすると、AccessControlExceptionで失敗します。 私はGAEのドキュメントを読んだことがありますが、これは、JavaからのURLFetchの場合、Googleが独自の実装を提供する通常のJava URLConnectionクラスを使用する必要があると述べています。私が見る限りでは、Clojure/Java interopを使用するだけで、その例を手紙に従っています。Clojureから呼び出されたApp EngineのURLFetchサービスがAccessControlExceptionを返します
、Googleのコード例は次のようになります。他の場所でドキュメントがURLConnectionのを使用することを言及が
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を呼び出しています。私は両方を試しましたが、結果は同じです。 私は、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やその他の場所に追加する必要のある設定があるかどうかを知りましたが、何も見えません。私が読んだことは、これが「うまくいく」べきだと私に伝えていますが、そうではありません。 アドバイスは大歓迎です。必要に応じて、完全なソースまたは完全なスタックトレースを投稿することができますが、私は上記がかなり適切なビットであると考えています。