我们的实时环境中的Web服务客户端最近得到了例外:
java.lang.NoClassDefFoundError: Could not initialize class com.sun.xml.internal.ws.fault.SOAPFaultBuilder
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:107)
at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78)
at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:135)
at com.sun.proxy.$Proxy146.search(Unknown Source)
....
我已经在线进行了大量搜索,包括StackOverflow上的一些帖子:
Catching webservice exception with CXF: NoClassDefFoundError: SOAPFaultBuilder
Could not initialize class com.sun.xml.internal.ws.fault.SOAPFaultBuilder
我的理解是我们的客户端从服务器收到SOAP Fault并且它丢失了一些jar文件。所以我试图通过首先重新创建它来解决问题。
我在Eclipse中创建了一个简单的Web Service服务器项目,它有一个web方法抛出一个由@WebFault
注释的简单错误类。然后我创建了一个使用Web方法的简单Web服务客户端项目。客户端项目在其类路径中没有任何额外的库/ jar;它只有JRE。令我惊讶的是,它没有抛出NoClassDefFoundError异常!相反,我得到了我在服务器端定义的javax.xml.ws.soap.SOAPFaultException
。
班级SOAPFaultBuilder
确实在JRE的rt.jar中。因此,我创建的简单Web服务项目可能正常工作。但是,为什么我们的实时环境中的Web服务客户端会抛出NoClassDefFoundError
异常?该项目肯定在类路径中有rt.jar。
任何人都可以对这个问题有所了解吗?如果它丢失了一些jar文件(来自jaxws RI或Apache CXF或其他),为什么我创建的超级简单客户端没有抛出错误?实时环境和我的本地环境都使用Java7u51。
答案 0 :(得分:1)
我有同样的错误,我通过删除tomcat lib文件夹中的jax-impl.jar解决了这个问题。这是jaxb jar版本与我在tomcat中安装的一个webapp的冲突。
http://programtalk.com/java/i-was-running-gwt-application-on-tomca/
答案 1 :(得分:0)
我遇到了同样的问题,随后我可以解决这个问题。
由于问题中提到的以下错误,无法找到SOAP Fault的根本原因。
我按照以下链接中提到的步骤来确定NoClassDefFoundError的原因。
http://javarevisited.blogspot.in/2011/06/noclassdeffounderror-exception-in.html
我可以在应用程序日志中找到以下错误:
java.lang.ExceptionInInitializerError
引起:java.lang.ClassCastException:com.sun.xml.bind.v2.runtime.JAXBContextImpl无法强制转换为com.sun.xml.internal.bind.api.JAXBRIContext
上述classcast异常的原因是由于jar文件冲突。
rt.jar
(这存在于jre类路径中)
jaxb-impl-2.0.1.jar
(这在我的应用程序类路径中出现)。
我已从类路径中删除了文件jaxb-impl-2.0.1.jar
,实际错误消失了。