Java 使用CXF:NoClassDefFoundError:SOAPFaultBuilder捕获Web服务异常

Java 使用CXF:NoClassDefFoundError:SOAPFaultBuilder捕获Web服务异常,java,cxf,soapfault,Java,Cxf,Soapfault,一段时间以来,我一直在使用Apache CXF wsdl2java生成的代码从Web服务调用方法,到目前为止,这种方法运行良好。。我遇到的问题是,当webservice(就在我身后实现)合法地抛出soap异常时,CXF会出现以下错误消息: 无法初始化类com.sun.xml.internal.ws.fault.SOAPFaultBuilder 我使用的是Ubuntu 9.04、OpenJDK(IcedTea6 1.4.1)6b14-1.1.1-0ubuntu11、Maven2和CXF 2.2.3

一段时间以来,我一直在使用Apache CXF wsdl2java生成的代码从Web服务调用方法,到目前为止,这种方法运行良好。。我遇到的问题是,当webservice(就在我身后实现)合法地抛出soap异常时,CXF会出现以下错误消息:

无法初始化类com.sun.xml.internal.ws.fault.SOAPFaultBuilder

我使用的是Ubuntu 9.04、OpenJDK(IcedTea6 1.4.1)6b14-1.1.1-0ubuntu11、Maven2和CXF 2.2.3。我目前不知道如何解决这个问题,因为我使用的代码和设置似乎非常简单。。有人能给我指出正确的方向吗?如果我能发布更多细节,请告诉我

这是返回的完整stacktrace:

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:107)
    at $Proxy36.downloadPDB(Unknown Source)
    at path.to.my.code.downloadInvalidFileID(SingleMethodTest.java:64)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.junit.internal.runners.TestMethod.invoke(TestMethod.java:59)
    at org.junit.internal.runners.MethodRoadie.runTestMethod(MethodRoadie.java:98)
    at org.junit.internal.runners.MethodRoadie$2.run(MethodRoadie.java:79)
    at org.junit.internal.runners.MethodRoadie.runBeforesThenTestThenAfters(MethodRoadie.java:87)
    at org.junit.internal.runners.MethodRoadie.runTest(MethodRoadie.java:77)
    at org.junit.internal.runners.MethodRoadie.run(MethodRoadie.java:42)
    at org.junit.internal.runners.JUnit4ClassRunner.invokeTestMethod(JUnit4ClassRunner.java:88)
    at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
    at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
    at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
    at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
    at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:62)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140)
    at org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127)
    at org.apache.maven.surefire.Surefire.run(Surefire.java:177)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:338)
    at org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:997)

关于堆栈跟踪,有两件有趣的事情:

1) 它在寻找SAAJ实现时遇到问题。也许将saaj-impl.jar添加到类路径可以解决这个问题


2) 它根本不使用CXF。它使用内置在jre中的Sun JAX-WS参考实现。因此,看起来cxf jar根本没有被使用。

当我们从Ant切换到Maven时,也有类似的问题。我们使用Sun JDK 1.6u20

我们错过了maven assembled war中的这些库:

JAXWSAPI jaxws-rt jaxws工具


在添加它们之后,所有的工作都和以前一样。希望这能帮助别人

CXSFFAQ中有一个“我可以在Java6下运行”条目,您检查过了吗?嗯,谢谢。我没有注意到这一点,现在在maven中添加了com.sun.xml.bind jaxb impl和jaxb xjc。。但是到目前为止没有运气/变化。。我会在这方面再做一些工作。看来运气不好:还是一样的stacktrace。。有什么我需要排除使用Maven的可能吗?嗯,很有趣(很好发现!)。。明天早上第一件事我会调查的!谢谢,添加cxf依赖项就成功了!从未考虑过将cxf作为依赖项添加,因为没有它,代码似乎可以正常工作。。我真傻。