cglib вызывает ошибку java.lang.VerifyError во время генерации запроса в SDK Java партнерской платформы Intuit.

Я не могу понять, что вызывает эту ошибку.

Я использую Intuit Java v3 SDK для QuickBooks Online (QBO) и пытаюсь выполнить запрос для объектов TimeActivity. Для этого я должен сгенерировать сущность запроса.

Мой код не работает в этой строке:

TimeActivity queryTimeActivity = GenerateQuery.createQueryEntity(TimeActivity.class);

Трассировка стека начинается с этой строки следующим образом:

java.lang.VerifyError: class net.sf.cglib.core.DebuggingClassWriter overrides final method visit.(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V
    at com.google.appengine.runtime.Request.process-4da1515b5814ac28(Request.java)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:795)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:360)
    at net.sf.cglib.core.AbstractClassGenerator.<init>(AbstractClassGenerator.java:38)
    at net.sf.cglib.core.KeyFactory$Generator.<init>(KeyFactory.java:127)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:112)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:108)
    at net.sf.cglib.core.KeyFactory.create(KeyFactory.java:104)
    at net.sf.cglib.proxy.Enhancer.<clinit>(Enhancer.java:69)
    at com.intuit.ipp.query.GenerateQuery.createQueryEntity(GenerateQuery.java:56)

Я должен упомянуть, что этот код находится в приложении Google App Engine. Я выполнил поиск этой ошибки в Google и обнаружил, что многие люди предлагают удалить библиотеки «cglib» и «asm» из пути сборки. Я не смог найти «cglib», но попытался удалить «asm-4.0.jar», но Google App Engine пожаловался, когда я попытался это сделать. Точнее, приложение было развернуто, но рассматриваемая строка так и не запустилась, когда я удалил asm.jar.

У кого-нибудь есть идеи? Я не могу заставить свой код выйти за пределы вышеупомянутой строки.


person Robert Warren Gilmore    schedule 11.01.2014    source источник
comment
Я не знаком с Java SDK инуитов. Это JDK? Если да, то почему вы должны использовать их SDK? Почему нельзя просто использовать стандартный JDK?   -  person Robin Green    schedule 11.01.2014
comment
Нет. Это не то. developer.intuit.com/docs/0025_quickbooksapi/0055_devkits   -  person Robert Warren Gilmore    schedule 11.01.2014
comment
Это библиотека, которая упрощает вызовы онлайн-API Intuit QuickBooks.   -  person Robert Warren Gilmore    schedule 11.01.2014


Ответы (3)


Обратите внимание, что исключение возникает во время вызова статического инициализатора (<clinit>) класса Enhancer cglib. Cglib использует ASM внутри, и кажется, что у вас есть несоответствующие версии cglib и ASM в вашем пути к классам.

Судя по ошибке, я предполагаю, что Intuit использует cglib 2.2, основанный на ASM 3.1. В этой версии, ClassWriter не объявлял свои методы как final. Это изменилось в ASM 4, так что cglib не может быть загружен, поскольку он переопределяет эти теперь final методы .

Что вы могли бы сделать, это либо

  1. Удалите ASM 4 из пути к классам, но добавьте ASM 3. См. в POM тот факт, что cglib 2.2.2 требует ASM 3.1.1.
  2. Явно добавьте cglib 3.1 в путь к классам, который работает с ASM 4. Однако это может привести к поломке приложения, использующего cglib.

Обычно библиотеки, использующие ASM, должны упаковывать последний в другой пакет, чтобы избежать проблем с zhis, как описано в документе ASM . Часто задаваемые вопросы. Создается впечатление, что авторы Intuit это упустили.

Наконец, обратите внимание, что здесь упоминается, что cglib 2.2 — это только частично поддерживается GAE.

person Rafael Winterhalter    schedule 12.01.2014
comment
Спасибо за конкретику. Создается впечатление, что авторы Intuit многое упустили. Я считаю, что партнерская платформа Intuit содержит множество ошибок. В любом случае, я полностью обошел эту проблему, написав свои собственные строки запроса без помощи GenerateQuery. - person Robert Warren Gilmore; 13.01.2014
comment
Пожалуйста. Если ваша проблема решена, отметьте ответ и проголосуйте за любой ответ, который показался вам полезным. - person Rafael Winterhalter; 13.01.2014

Я попробовал следующее, и это сработало нормально.

TimeActivity timeActivity = GenerateQuery.createQueryEntity(TimeActivity.class);
String query   = select($(timeActivity.getId()),$(timeActivity.getSyncToken())).generate();
System.out.println("Generated Query - " + query);
QueryResult queryResult = service.executeQuery(query);

Можете ли вы проверить, работает ли он в вашей локальной системе.

Спасибо

person Manas Mukherjee    schedule 12.01.2014
comment
Он отлично работает в моей локальной системе. Он ломается, когда я развертываю его в Google App Engine. - person Robert Warren Gilmore; 12.01.2014
comment
В итоге я написал свою собственную строку запроса вручную, поскольку вся цель GenerateQuery состоит в том, чтобы составить строку SQL. Казалось, гораздо проще обойти генератор запутанных строк запроса. Проблема остается не диагностированной, но в любом случае обойденной. - person Robert Warren Gilmore; 12.01.2014

Как объясняет raphw выше, вариант 2 исправил это для меня. В моем случае я использовал другой артефакт, включающий ASM 4. Я добавил следующую зависимость в свой файл POM, и ошибка больше не появляется:

<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>3.1</version>
</dependency>
person Forrest    schedule 22.05.2014