VerifyError после обновления до Appengine 1.6.6; Невозможно создать экземпляр UrlFetchTransport - google-api-java-client 1.8.0 /1.9.0-beta

После обновления появляется эта ошибка:

  

java.lang.VerifyError: (класс:   ru /mydomain /server /webservices /OAuth2Utils, метод: newFlow   подпись:   () Lcom /Google /API /клиент /googleapis /авт /oauth2 /GoogleAuthorizationCodeFlow;)   Несовместимый аргумент для функции

Не уверен, что это может быть связано, но немного информации о моей среде:

Linux n53sv 3.2.0-24-generic # 38-Ubuntu SMP Вт 1 мая 16:18:50 UTC 2012 x86_64 x86_64 x86_64 GNU /Linux Java-версия "1.6.0_31" Java (TM) SE Runtime Environment (сборка 1.6.0_31-b04) Java HotSpot (TM) 64-разрядная серверная виртуальная машина (сборка 20.6-b01, смешанный режим)

UPDATE:

Я сократил проблему до минимума, и это действительно невероятно. Я создал класс BadClassTest и создаю экземпляр 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, метод: signature: () V) Неверный тип в putfield /puttatic

7 голосов | спросил koma 26 Maypm12 2012, 12:07:24

2 ответа


0

Обновление (6 июня 2012 г.): мы планируем исправить это в следующей версии клиентской библиотеки в начале следующей недели. Мы просто переименуем пакет com.google.api.client.extensions.appengine.http.urlfetch в com.google.api.client.extensions.appengine.http

Оригинальный ответ:

Мы выяснили проблему: com.google.api.client.extensions.appengine.http.urlfetch.UrlFetchTransport включен в SDK App Engine в appengine-local-webapis.jar. Этот класс на самом деле там по ошибке, и фактически весь сосуд не нужен. Наша основная рекомендация в качестве обходного пути - просто удалить этот jar-файл из вашего пакета App Engine SDK. Он загружается только на локальном сервере разработки, а не в производственном App Engine. Я еще не пробовал это сам, но другой инженер уверяет меня, что это должно работать. Пожалуйста, попробуйте и дайте мне знать.

Если этот обходной путь не работает, вы можете попробовать перейти на App Engine SDK 1.6.5. Appengine-local-webapis.jar является новой версией 1.6.6, и опять же, это только проблема для локальной разработки.

Наконец, если это не сработает, переключитесь на NetHttpTransport, как рекомендует koma. Существует ошибка в реализации App Engine HttpURLConnection (на которой построен NetHttpTransport), заключающаяся в том, что она разделяет заголовки HTTP-ответов на запятые. У UrlFetchTransport нет этой проблемы. Однако это вряд ли повлияет на большинство разработчиков, если, например, вы не обрабатываете перенаправления, а URL-адрес перенаправления содержит запятую. Это не должно быть проблемой для любого API Google, кроме старой версии API данных календаря версии 2 (не для новой версии 3).

Я сейчас работаю с командой App Engine, чтобы убедиться, что это будет исправлено в следующем выпуске. Извините за это!

ответил Yaniv Inbar 2 J0000006Europe/Moscow 2012, 05:47:57
0

Я получил подтверждение от другого пользователя в google-api-java-client group , которые столкнулись с этой проблемой. Временное решение: удалить UrlFetchTransport и использовать NetHttpTransport, который, похоже, поддерживается в настоящее время в AppEngine.

Я заменил реализацию моего глобального экземпляра HttpTransport на NetHttpTransport вместо UrlFetchTransport, развернут и успешен.

* ОБНОВЛЕНИЕ *

Ответ Янива (руководитель google-api-java-client):

UrlFetchTransport по-прежнему считается рекомендуемым выбором в Google App Engine. В реализации HttpURLConnection в Google App Engine есть недостаток с точки зрения синтаксического анализа заголовков HTTP, тогда как в UrlFetch такого недостатка нет. Но если NetHttpTransport работает на вас, вы можете продолжать его использовать.

Однако, честно говоря, я не пробовал это с App Engine 1.6.6. Я только попробовал это на 1.6.5. Я бы очень хотел увидеть расследование того, что приводит к сбою на 1.6.6. Другая возможность заключается в том, что он не новичок в 1.6.6, а скорее отличается от того, как вы настроили свою среду.

ответил koma 30 Mayam12 2012, 00:54:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132