CXF 2.7.16:ClassFormatError:JVMCFRE114字段名无效; jaxws_asm

时间:2016-01-06 22:12:30

标签: java web-services jaxb websphere cxf

我们将CXF从v2.2.6升级到v2.7.16。当我们在Linux机器上启动IBM WebSphere Application Server v7.0.0.33时,会报告 jaxws_asm / RetrieveRssFeedResponse的错误:

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 / abc / mobile / service / rss
  • org.apache.cxf / cxf-bundle.jar / 2.7.16中的类WrapperClassGenerator在第160行附加Java包“jaxws_asm”:

    String pkg = new StringBuilder()。append(getPackageName(method))。append(“。 jaxws_asm ”)。append(anonymous?“_ anan”:“”)。toString();

  • 我们的应用程序代码com.abc.mobile.service.rss.GlobalProductRssService.java有:

    @WebMethod(operationName =“retrieveRssFeed”)

  • org.apache.cxf / cxf-bundle.jar / 2.7.16中的类WrapperClassGenerator在第164行追加类名“Response”:

    className = new StringBuilder()。append(className).append(“ Response ”)。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 this=com.ibm.ws.classloader.CompoundClassLoader@736d736d[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 this=com.ibm.ws.classloader.CompoundClassLoader@70207020[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的任何线索,我们深表感激。

1 个答案:

答案 0 :(得分:-1)

非常感谢你的帮助。通过从@WebResult注释中删除“[]”来解决该问题。换句话说,最初我们的应用程序代码有:

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

错误通过将其更改为:

来解决
    @WebMethod(operationName = "retrieveRssFeed")
    @WebResult(name = "RssChannelDTO")

我们所做的是:

  • 修改CXF / 2.7.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以添加main方法(因为内部类TypeHelperClassLoader的构造函数是私有的)来调用loader.defineClass()方法

  • 运行main方法后,报告错误:

            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;
    

现在错误已经消失,我们的WebSphere Application Server v7.0可以在没有任何错误的情况下启动。

关于IBM类加载跟踪日志仅显示“jaxws.RetrieveRssFeedResponse”,我想情况是:

  • IBM日志记录语句可能会忽略“_”以及日志记录期间的任何内容
  • 但是IBM类加载器仍然可以加载“jaxws_asm.RetrieveRssFeedResponse”

无论如何,这只是我的猜测,我没有检查任何IBM源代码。