升级到Appengine 1.6.6后的VerifyError; 无法创建UrlFetchTransport的实例 - google-api-java-client 1.8.0/1.9.0-beta

kom*_*oma 7 google-app-engine verifyerror google-api-java-client

升级后出现此错误:

java.lang.VerifyError :(类:com/mydomain/server/webservices/OAuth2Utils,方法:newFlow签名:()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 version"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();
    }

}
Run Code Online (Sandbox Code Playgroud)

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

当我的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();
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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

Yan*_*bar 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 包含在 App Engine SDK 的 appengine-local-webapis.jar 中。这个类实际上是错误存在的,而且事实上整个 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 团队合作,确保在下一个版本中修复此问题。对于那个很抱歉!