我一直在使用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.我目前对如何解决这个问题感到茫然,因为我使用的代码和设置似乎很简单..任何人都能指出我在正确的方向吗?如果我可以发布任何进一步的细节,请告诉我..
这是返回的完整堆栈跟踪:
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)
Run Code Online (Sandbox Code Playgroud) 我有一个wcf服务.服务本身(继承ServiceContract的类)有一个构造函数,有时会抛出异常.如果服务失败,我想向用户显示一条消息.我应该像使用服务方法一样使用故障吗?
我们正在将第三方SOAP Web服务集成到我们的应用程序中.WSDL与SOAPUI工具一起使用,其中样本请求和响应工作正常.
当我们尝试与apache Axis 1.3集成时,我们尝试使用WSDL的WSDL2JAVA.我们收到了以下错误消息
java.io.IOException的:错误:缺少元件InFault已 "serviceFault" 在操作中 "serviceFault",在org.apache.axis在org.apache.axis.wsdl.symbolTable.SymbolTable.faultsFromSOAPFault(SymbolTable.java:2858)结合saveRegistration .wsdl.symbolTable.SymbolTable.populateBindings(SymbolTable.java:2549)在org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:744)在org.apache.axis.wsdl.symbolTable.SymbolTable.add (SymbolTable.java:543)在org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:518)在org.apache.axis.wsdl.symbolTable.SymbolTable.populate(SymbolTable.java:495)在java.lang.Thread.run上的org.apache.axis.wsdl.gen.Parser $ WSDLRunnable.run(Parser.java:361)(未知来源)
有人已经遇到过这个问题并解决了吗
我正在为Java ws制作.net wcf客户端。但是当我发出一个请求,并且响应包含错误时,它也包含multiRef部分。所以我得到这个异常:
服务器返回了无效的SOAP错误。来自名称空间“ http://schemas.xmlsoap.org/soap/envelope的结束元素” Body” 。从名称空间中找到元素'multiRef'''
这是服务器响应的样子(直接从网络获取):
<soapenv:Envelope>
<soapenv:Header/>
<soapenv:Body>
<soapenv:Fault>...</soapenv:Fault>
<multiRef>...</multiRef>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
有什么方法可以配置我的wcf客户端以反序列化该消息吗?还是有可能获取原始响应xml?
我使用以下 WSDL 托管 WCF Web 服务(使用 wsHttpBinding 和 SSL 实现传输安全的简单服务):
<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:tns="http://tempuri.org/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" name="MagicEightBallService" targetNamespace="http://tempuri.org/">
<wsp:Policy wsu:Id="WSHttpBinding_TransportSecurity_IMagicEightBallService_policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp:Policy>
</sp:TransportToken>
<sp:AlgorithmSuite>
<wsp:Policy>
<sp:Basic256/>
</wsp:Policy>
</sp:AlgorithmSuite>
<sp:Layout>
<wsp:Policy>
<sp:Strict/>
</wsp:Policy>
</sp:Layout>
</wsp:Policy>
</sp:TransportBinding>
<wsaw:UsingAddressing/>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://my.local.domain.name/MagicEightBall/MagicEightBallService.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://my.local.domain.name/MagicEightBall/MagicEightBallService.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IMagicEightBallService_GetAdvice_InputMessage">
<wsdl:part name="parameters" element="tns:GetAdvice"/>
</wsdl:message>
<wsdl:message name="IMagicEightBallService_GetAdvice_OutputMessage">
<wsdl:part name="parameters" element="tns:GetAdviceResponse"/>
</wsdl:message> …Run Code Online (Sandbox Code Playgroud) 我使用JAX WS 2.0调用SOAP Web服务.如果出现错误,我收到以下回复:
<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap- envelope">
<soap:Header/>
<soap:Body>
<soap:Fault xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://www.w3.org/2003/05/soap- envelope" xmlns:xml="http://www.w3.org/XML/1998/namespace">
<soap:Code>
<soap:Value>soap:Receiver</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">Exception of type 'blah blah' was thrown.
</soap:Text>
</soap:Reason>
<soap:Node>{SOME URL}</soap:Node>
<detail>
<error>345</error>
<message>Cannot find user. Blah blah</message>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)
您可以在详细信息节点中看到有用的错误:
<soap:Envelope>
<soap:Body>
<soap:Fault>
<detail>
Run Code Online (Sandbox Code Playgroud)
在我的客户端,我得到一个SOAPFaultException,它有一个SOAPFault对象.SOAPFault对象似乎缺少我上面发布的节点.SOAPFaultException.getFault().getDetail()为null.但是,它包含所有其他节点,包括soap:Reason.知道为什么它缺少细节节点吗?
谢谢.
我编写了一个自定义 CXF 拦截器来将所有 SOAP 请求和响应记录到数据库中,并且它似乎在正面测试用例和服务器错误的情况下工作正常。
但是当发生 SOAP 错误时,它只是忽略了我的拦截器并且没有记录任何内容。
自定义 CXF 拦截器。
public class DbLogOutInterceptor extends AbstractSoapInterceptor {
public void handleMessage(SoapMessage message) {
logger.info("Handling outbound request");
String transaction = MDC.get(mdcKey);
logger.info("OutBound Transaction ID : {} ", transaction);
//code to log the SOAP message in database
.......
}
}
Run Code Online (Sandbox Code Playgroud)
我没有看到此方法的日志语句,而是看到了
11:56:34,102 INFO [Soap12FaultOutInterceptor] class org.apache.cxf.binding.soap.interceptor.Soap12FaultOutInterceptor$Soap12FaultOutInterceptor Internalapplication/soap+xml
11:56:34,103 INFO [EligibilityInfo] Outbound Message
---------------------------
ID: 2
Response-Code: 500
Encoding: UTF-8
Content-Type: application/soap+xml
Headers: {}
Payload :
Run Code Online (Sandbox Code Playgroud)
为了在我的自定义拦截器中捕获 SOAP 错误错误,我必须做什么。
我正在编写一个客户端,使用ksoap2在Android中使用SOAP Web服务.我收到了SOAP FAULT异常.以下是LogCat的摘录.
<soapenv:Body><soapenv:Fault xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><faultcode>soapenv:Client</faultcode><faultstring>Bad request</faultstring></soapenv:Fault></soapenv:Body></soapenv:Envelope>
04-06 09:04:09.693: E/SearchPublications(1159): SoapFault - faultcode: 'soapenv:Client' faultstring: 'Bad request' faultactor: 'null' detail: null
Run Code Online (Sandbox Code Playgroud)
这就是我从WSDL中提取最终字符串的值的方法:
Namespace:该属性的值namespace的xsd:import
元件,这是的子元素xsd:schema,其是的子元素types SoapAction:名称空间附加方法的名称MethodName:API中方法的名称URL:WSDL的实际URL(参考:这个答案和它中提到的链接.)
我知道我的代码有问题,但是有人可以说可能导致它的原因以及我是否正确设置了所提到的最终变量的值?
我试图通过设置dotnet标志作为true和false为好.我试图获得响应,SoapObject因为它是一个XML文档,我在一篇文章中读到,如果结果是XML,请使用SoapObject.
我也尝试调试它,并且所有变量显然在此行之前具有正确的值(如调试透视图所示):
result= (SoapObject) envelope.getResponse();
Run Code Online (Sandbox Code Playgroud)
在这条线上,抛出了SoapFault; 您可以比较以下代码和屏幕截图.有人可以建议为什么会发生这种情况以及还有什么可以解决这个问题?
try{
result = (SoapObject) soapEnvelope.getResponse();
} catch (Throwable e) {
Run Code Online (Sandbox Code Playgroud)

我们的实时环境中的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)
....
Run Code Online (Sandbox Code Playgroud)
我已经做了很多在线搜索,包括StackOverflow上的一些帖子:
使用CXF捕获Web服务异常:NoClassDefFoundError:SOAPFaultBuilder
无法初始化com.sun.xml.internal.ws.fault.SOAPFaultBuilder类
java.lang.NoClassDefFoundError:无法初始化com.sun.xml.internal.ws.fault.SOAPFaultBuilder类
我的理解是我们的客户端从服务器收到了SOAP错误,并且缺少一些jar文件。因此,我正在尝试通过重新创建解决该问题。
我在Eclipse中创建了一个简单的Web服务服务器项目,该项目具有一个Web方法,该方法抛出一个由注释的简单故障类@WebFault。然后,我创建了一个使用Web方法的简单Web服务客户端项目。客户端项目的类路径中没有任何其他库/ jar;它仅有的就是JRE。令我惊讶的是,它没有引发NoClassDefFoundError异常!相反,我javax.xml.ws.soap.SOAPFaultException在服务器端定义了I。
该类SOAPFaultBuilder确实位于JRE的rt.jar中。因此,我创建的简单Web服务项目可能会按预期工作。但是,我们的实时环境中的Web服务客户端如何引发NoClassDefFoundError异常?该项目肯定在类路径中有rt.jar。
任何人都可以阐明这个问题吗?如果缺少一些jar文件(来自jaxws RI或Apache CXF或其他文件),为什么我创建的超级简单客户端没有抛出错误?实时环境和本地环境都使用Java7u51。
<soapenv:Fault xmlns:m="http://schemas.xmlsoap.org/soap/envelope/">
<faultcode>m:Server</faultcode>
<faultstring>someFaultString</faultstring>
<detail>
<NS1:confirmIdentityErrorInfo xmlns:NS1="example.com">
<faultInfo>
<faultType>Business Exception</faultType>
<faultCode>100</faultCode>
<message>some message</message>
<faultState>fault state</faultState>
</faultInfo>
</NS1:confirmIdentityErrorInfo>
</detail>
</soapenv:Fault>
Run Code Online (Sandbox Code Playgroud)
我需要如上所述生成故障对象。我能够生成“confirmIdentityErrorInfo”,但无法添加子元素。我尝试了这个选项,但无法生成嵌套对象结构。
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public SoapFaultMappingExceptionResolver exceptionResolver(){
SoapFaultMappingExceptionResolver exceptionResolver = new DetailSoapFaultDefinitionExceptionResolver();
SoapFaultDefinition faultDefinition = new SoapFaultDefinition();
faultDefinition.setFaultCode(SoapFaultDefinition.SERVER);
exceptionResolver.setDefaultFault(faultDefinition);
Properties errorMappings = new Properties();
errorMappings.setProperty(Exception.class.getName(), SoapFaultDefinition.SERVER.toString());
errorMappings.setProperty(BusinessException.class.getName(), SoapFaultDefinition.SERVER.toString());
exceptionResolver.setExceptionMappings(errorMappings);
exceptionResolver.setOrder(1);
return exceptionResolver;
}
Run Code Online (Sandbox Code Playgroud)
}
protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
if (ex instanceof BusinessException) {
SoapFaultDetail detail = fault.addFaultDetail();
try
{
QName entryName = …Run Code Online (Sandbox Code Playgroud) soapfault ×10
java ×5
soap ×4
cxf ×2
jax-ws ×2
wcf ×2
web-services ×2
android ×1
axis2 ×1
constructor ×1
debugging ×1
interceptor ×1
jar ×1
soap-client ×1
spring ×1
wsdl2java ×1