2016-01-06 1 views
0

Мы обновляем CXF с версии 2.2.6 до версии 2.7.16. Когда мы начинаем v7.0.0.33 IBM WebSphere Application Server в Linux машине, сообщается об ошибке для jaxws_asm/RetrieveRssFeedResponse:CXF 2.7.16: Имя поля ClassFormatError: JVMCFRE114 недопустимо; jaxws_asm

Caused by: java.lang.ClassFormatError: JVMCFRE114 field name is invalid; class=com/abc/mobile/service/rss/jaxws_asm/RetrieveRssFeedResponse, offset=0 
    at java.lang.ClassLoader.defineClassImpl(Native Method) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:287) 
    at java.lang.ClassLoader.defineClass(ClassLoader.java:224) 
    at org.apache.cxf.common.util.ASMHelper$TypeHelperClassLoader.defineClass(ASMHelper.java:367) 
    at org.apache.cxf.common.util.ASMHelper.loadClass(ASMHelper.java:316) 
    at org.apache.cxf.jaxws.WrapperClassGenerator.createWrapperClass(WrapperClassGenerator.java:229) 

Вот наше нынешнее понимание:

  • Эта ошибка не происходит в локальной машине Windows WAS7.0.0.11
  • Класс jaxws_asm.RetrieveRssFeedResponse не существует во время компиляции. Вместо этого он генерируется CXF во время выполнения.
  • Нашего кода приложение имеет пакет Java: COM/а/мобильный/сервис/Новости
  • класс WrapperClassGenerator в org.apache.cxf/CxF-bundle.jar/2.7.16 присоединяет Java пакет «jaxws_asm» в строке 160 :

    Строка упак = новый StringBuilder() присоединять (getPackageName (метод)) добавьте ("jaxws_asm.") .append (анонимный "_an": "").. .ToString();

  • Наш код приложения com.abc.mobile.service.rss.GlobalProductRssService.java имеет:

    @WebMethod (operationName = "retrieveRssFeed")

  • Класс WrapperClassGenerator в org.apache.cxf/. CXF-bundle.jar/2.7.16 добавляет имя класса «Response» в строке 164:

    = новый имя класса StringBuilder() добавление (имя класса) .append ("отклика") .ToString();

  • Мы попытались добавить asm/asm.jar/3.3.1 в WEB-INF/lib или WAS7.0/java/jre/lib/ext. Это не помогло.

  • Мы включили журнал отслеживания загрузки классов, следуя документу IBM MustGather: http://www-01.ibm.com/support/docview.wss?uid=swg21196187.

журнала трассировки показывает, что "JAXWS .RetrieveRssFeedResponse" загружается:

[1/5/16 11:39:04:447 EST] 00000014 CompoundClass > loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse [email protected][PL][war:US-EAR/US.war] Entry 
[1/5/16 11:39:04:447 EST] 00000014 CompoundClass > loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse [email protected][app:US-EAR] Entry 
[1/5/16 11:39:04:448 EST] 00000014 CompoundClass < loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse failed Exit 
[1/5/16 11:39:04:448 EST] 00000014 CompoundClass < loadClass com.abc.mobile.service.rss.jaxws.RetrieveRssFeedResponse failed Exit 

я не узнал, почему выше класс загрузки нагрузки журнала трассировки "JAXWS .RetrieveRssFeedResponse". Очень приветствуется, если кто-нибудь может поделиться любой подсказкой о том, как решить этот ClassFormatError.

+0

Возможно, это ошибка JVM, но я подозреваю, что CXF генерирует недопустимое имя поля (например, содержащее '-' из-за некоторого элемента XML). К сожалению, ошибка JVM не включает имя поля, поэтому вы можете попытаться открыть PMR с IBM для этого, но, вероятно, проще изменить класс CXF класса ASMHelper $ TypeHelperClassLoader', чтобы сбросить определяемые байты класса, а затем проверить они сами видят, какие имена полей определяются/указаны. –

+0

Спасибо @Brett Kail. ASMHelper.java строка 367 имеет только имя класса: 'ret = super.defineClass (name.replace ('/', '.'), Bytes, 0, bytes.length);' Я думаю, возможно, я могу изменить WrapperClassGenerator .java для непосредственного использования asm.jar. –

+0

Мое предложение состояло в том, чтобы изменить эту строку кода, чтобы записать эти байты в файл, чтобы вы могли их проверить (например, с помощью javap), чтобы узнать, пытается ли созданный байт класса определить поле с недопустимым именем (например, -'). –

ответ

-1

Большое вам спасибо за помощь. Проблема была решена путем удаления «[]» из аннотации @WebResult. Другими словами, первоначально наш код приложения имеет:

@WebMethod(operationName = "retrieveRssFeed") 
    @WebResult(name = "RssChannelDTO[]") 

ошибка решается путем изменения его:

@WebMethod(operationName = "retrieveRssFeed") 
    @WebResult(name = "RssChannelDTO") 

Что мы сделали:

  • Изменить CXF/2,7 +0,16/ASMHelper.java defineClass() для печати динамически сгенерированных классов. Всего было напечатано 302 класса.

     System.out.println("***********ASMHelper.TypeHelperClassLoader.defineClass(): " + name.replace('/', '.')); 
         try { 
          java.io.FileOutputStream fos = new java.io.FileOutputStream(name.replace('/', '.') + ".class"); 
          fos.write(bytes); 
          fos.close(); 
         } catch (java.io.IOException ioe) { 
          ioe.printStackTrace(); 
         } 
    
  • Среди всех 302 создаваемых классов, только RetrieveRssFeedResponse.class имеет "[]" в имени поля

     @XmlElement(name="RssChannelDTO[]") 
         private RssChannelDTO[] RssChannelDTO[]; 
    
  • Изменить CXF/2.7.16/ASMHelper.java, чтобы добавить основной метод (т.к. конструктор внутреннего TypeHelperClassLoader класса является частным) для вызова метода loader.defineClass()

  • После запуска основного метода, сообщают об ошибке:

     Exception in thread "main" java.lang.ClassFormatError: Illegal field name "RssChannelDTO[]" in class RetrieveRssFeedResponse 
          at java.lang.ClassLoader.defineClass1(Native Method) 
          at java.lang.ClassLoader.defineClass(ClassLoader.java:760) 
          at java.lang.ClassLoader.defineClass(ClassLoader.java:642) 
          at org.apache.cxf.common.util.ASMHelper$TypeHelperClassLoader.defineClass(ASMHelper.java:377) 
          at org.apache.cxf.common.util.ASMHelper.main(ASMHelper.java:513) 
    
  • Затем мы изменили наш код приложения, чтобы удалить «[]» из аннотации @WebResult. Сформированный RetrieveRssFeedResponse.class имеет:

     @XmlElement(name="RssChannelDTO") 
         private RssChannelDTO[] RssChannelDTO; 
    

Теперь ошибка ушла, и наш v7.0 WebSphere Application Server может быть запущен без каких-либо ошибок.

Что касается журнала загрузки классов трассировки IBM показывает только «jaxws.RetrieveRssFeedResponse», я думаю, ситуация:

  • заявление IBM каротаж может игнорировать «_», и ничего после него во время регистрации
  • Но IBM класс загрузчик может по-прежнему загружать «jaxws_asm.RetrieveRssFeedResponse»

В любом случае, это только моя догадка, и я не проверял какой-либо исходный код IBM.