我们将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)
以下是我们目前的理解:
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。它没有帮助。
跟踪日志显示正在加载“ 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的任何线索,我们深表感激。
答案 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源代码。