【发布时间】:2013-07-25 19:11:03
【问题描述】:
我使用的是 Dropbox API for Java 1.6 版,可在此处找到:https://www.dropbox.com/developers/core/sdks/java
我也在 Eclipse 3.7 中使用 GWT 2.5.1
我有以下代码在作为 Java 应用程序运行时可以工作:
DbxRequestConfig requestConfig = new DbxRequestConfig(type, locale);
DbxAppInfo appInfo = new DbxAppInfo(APP_ID, APP_SECRET);
DbxWebAuthNoRedirect webauth = new DbxWebAuthNoRedirect(requestConfig, appInfo);
String result = webauth.start();
System.out.println(result);
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String code = reader.readLine();
webauth = new DbxWebAuthNoRedirect(requestConfig, appInfo);
DbxAuthFinish finish = webauth.finish(code);
DbxClient client = new DbxClient(requestConfig, finish.accessToken);
DbxAccountInfo info = client.getAccountInfo();
long total = info.quota.total;
long used = info.quota.normal;
System.out.println("total: " + total);
System.out.println("used: " + used);
当我将它作为 Java 应用程序运行时,它可以正常工作。但是,当我尝试在 RemoteServiceServlet 中使用 GWT 做类似的事情时。当我尝试做时遇到异常
webauth = new DbxWebAuthNoRedirect(requestConfig, appInfo);
我得到的异常如下:
Caused by: java.lang.ClassCastException: com.google.apphosting.utils.security.urlfetch.URLFetchServiceStreamHandler$Connection cannot be cast to javax.net.ssl.HttpsURLConnection
at com.dropbox.core.http.StandardHttpRequestor.prepRequest(StandardHttpRequestor.java:160)
at com.dropbox.core.http.StandardHttpRequestor.startPost(StandardHttpRequestor.java:87)
at com.dropbox.core.http.StandardHttpRequestor.startPost(StandardHttpRequestor.java:21)
at com.dropbox.core.DbxRequestUtil.startPostNoAuth(DbxRequestUtil.java:156)
at com.dropbox.core.DbxRequestUtil.doPostNoAuth(DbxRequestUtil.java:289)
at com.dropbox.core.DbxWebAuthHelper.finish(DbxWebAuthHelper.java:40)
at com.dropbox.core.DbxWebAuthNoRedirect.finish(DbxWebAuthNoRedirect.java:84)
at com.cloudshare.server.DropboxPlayground.getFinish(DropboxPlayground.java:21)
at com.cloudshare.server.DropboxServiceImpl.authenticate(DropboxServiceImpl.java:70)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:115)
at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
... 40 more
在过去的几个小时里,我一直在用头撞墙,试图弄清楚发生了什么。我最初想使用 DbxWebAuth,但他们的 API 中的文档包含的指令包含不存在的类(我假设他们曾经这样做过)。
我觉得 DbxWebAuthNoRedirect 正在做一些事情,它根据可用的类动态加载连接。但我一直无法弄清楚。
提前感谢您的帮助!
编辑:
好的,所以我查看了 Dropbox API 源,错误发生在这里:
URL urlObject = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) urlObject.openConnection(this.proxy);
因为我使用的是 Google App Engine,所以它使用的是自己的 URL 对象,而不是 App Engine API 导入的对象。关于不涉及为 Dropbox API 编写 GWT 包装器的解决方案的任何想法。
【问题讨论】:
-
你在为谷歌应用引擎开发吗?如果是这样,则 dropbox api 使用的错误消息
HttpsURLConnection中提到的类与应用程序引擎的工作方式不兼容。如果您不是为应用引擎开发,则需要禁用应用引擎。 -
我正在使用 GAE。关于变通的任何想法?
-
在您的编辑中。 GAE 在内部根据传递的 url 创建一个连接器。但是,由于 dropbox api 是一个
httpsurl,因此 dropbox api 期望返回一个安全连接类,它会将其转换为该类。然而 GAE 只支持http并且会返回一个不安全的 http 连接器,它不能被转换为安全连接类。由于 dropbox api 的源代码在 github 上,您可以尝试将代码更改为不安全的对象,但我不知道这是否可行。 (作为旁注,这不是 GWT 问题,而是 GAE 问题)
标签: java gwt dropbox dropbox-api