Перехват исключения веб-сервиса с помощью CXF:NoClassDefFoundError ( Отсутствие класса ):Мыловаренный конструктор
Вопрос
Я уже некоторое время использую сгенерированный Apache CXF wsdl2java код для вызова методов из веб-сервиса, который пока работает нормально..Проблема, с которой я сталкиваюсь, заключается в том, что когда веб-сервис (реализованный чуть дальше по коридору от меня) законно выдает исключение soap, CXF выдает следующее сообщение об ошибке:
Не удалось инициализировать класс com.sun.xml.internal.ws.ошибка.SOAPFaultBuilder
Я использую Ubuntu 9.04, OpenJDK (IcedTea6 1.4.1) 6b14-1.1.1-0ubuntu11, Maven2 и CXF 2.2.3.В настоящее время я не знаю, как решить эту проблему, поскольку код и настройки, которые я использую, кажутся тривиально простыми..Кто-нибудь может указать мне здесь правильное направление?Дайте мне знать, если я смогу опубликовать какие-либо дополнительные подробности..
Это полная возвращенная трассировка стека:
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.Он использует эталонную реализацию Sun JAX-WS, встроенную в jre.Таким образом, похоже, что банки cxf вообще не подхватываются.
Другие советы
Возникла аналогичная проблема, когда мы переключались с Ant на Maven.Мы используем Sun JDK 1.6u20.
Мы пропустили эти библиотеки в war, собранных maven:
jaxws-api jaxws-rt jaxws-инструменты
После их добавления все работает так, как работало раньше.Надеюсь, это кому-нибудь поможет!