7

升级后出现此错误:

java.lang.VerifyError: (class: com/mydomain/server/webservices/OAuth2Utils, method: newFlow signature: ()Lcom/google/api/client/googleapis/auth/oauth2/GoogleAuthorizationCodeFlow;) 函数参数不兼容

不确定这是否相关,但有关我的环境的一些信息:

Linux n53sv 3.2.0-24-generic #38-Ubuntu SMP Tue May 1 16:18:50 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux java 版本“1.6.0_31”Java(TM) SE 运行时环境(构建 1.6.0_31- b04) Java HotSpot(TM) 64 位服务器 VM(内部版本 20.6-b01,混合模式)

更新:

我把这个问题降到最低限度,这真的令人难以置信。我创建了一个 BadClassTest 类,并在 Servlet 中创建了一个 BadClassTest 实例。当我的 BadClassTest 看起来像这样时:

public class BadClassTest {

    public BadClassTest() {
        com.google.api.client.http.HttpTransport HTTP_TRANSPORT = new com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport();
    }

}

然后我可以创建一个实例。

当我的 BadClassTest 看起来像这样时:

public class BadClassTest {

    com.google.api.client.http.HttpTransport HTTP_TRANSPORT = new com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport();

    public BadClassTest() {
        //com.google.api.client.http.HttpTransport HTTP_TRANSPORT = new com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport();
    }

}

现在无法创建 BadClassTest 的实例。我遇到以下异常:

java.lang.VerifyError:(类:com/klawt/server/BadClassTest,方法:签名:()V)putfield/putstatic中的错误类型

4

2 回答 2

4

更新(2012 年 6 月 6 日):我们计划在下周初在客户端库的下一个版本中解决此问题。我们只是将包 com.google.api.client.extensions.appengine.http.urlfetch 重命名为 com.google.api.client.extensions.appengine.http

原答案:

我们发现了问题: com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport 包含在 appengine-local-webapis.jar 的 App Engine SDK 中。这个类实际上是错误的,实际上整个jar是不必要的。作为解决方法,我们的主要建议是从您的 App Engine SDK 安装中删除此 jar。它仅加载在本地开发服务器中,而不是在生产 App Engine 中。我自己还没有尝试过,但另一位工程师向我保证它应该可以工作。请尝试并告诉我。

如果该解决方法不起作用,您可以尝试降级到 App Engine SDK 1.6.5。appengine-local-webapis.jar 是 1.6.6 的新内容,同样这只是本地开发的问题。

最后,如果这对您不起作用,请按照 koma 的建议切换到 NetHttpTransport。App Engine HttpURLConnection 实现(在其上构建了 NetHttpTransport)中存在一个错误,它用任何逗号分隔 HTTP 响应标头。UrlFetchTransport 没有这个问题。但是,这不太可能影响大多数开发人员,除非您正在处理重定向并且重定向 URL 中包含逗号。除了旧的日历数据 API 版本 2(不适用于新版本 3)之外,任何 Google API 都应该不是问题。

我现在正在与 App Engine 团队合作,以确保在下一个版本中解决此问题。对于那个很抱歉!

于 2012-06-02T01:47:57.810 回答
1

我得到了google-api-java-client 组中遇到此问题的另一个用户的确认。解决方法是删除 UrlFetchTransport 并使用 AppEngine 现在似乎支持的 NetHttpTransport。

我用 NetHttpTransport 而不是 UrlFetchTransport 替换了我的全局 HttpTransport 实例的实现,部署并成功。

*更新*

Yaniv(google-api-java-client Lead)的回答:

UrlFetchTransport 仍然应该是 Google App Engine 上的推荐选择。在解析 HTTP 标头方面,HttpURLConnection 的 Google App Engine 实现存在缺陷,而 UrlFetch 没有该缺陷。但如果 NetHttpTransport 对您有用,那么您可以继续使用它。

但是,老实说,我还没有在 App Engine 1.6.6 上尝试过。我只在 1.6.5 上尝试过。我真的很想看看是什么原因导致它在 1.6.6 上失败。另一种可能性是它对 1.6.6 来说并不新鲜,而是您设置环境的方式有所不同。

于 2012-05-29T20:54:41.057 回答