我正试图将我的web服务客户机从Apache AXIS-1迁移到Apache CXF。web服务本身运行om AXIS-1,不受我的控制。
我生成了所有CXF工件,客户端一直工作良好,直到服务抛出任何错误。错误的XML如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server</faultcode>
<faultstring>Remote error processing component card request</faultstring>
<detail>
<fault>
<faultcode>:-303</faultcode>
<faultstring>Remote error processing component card request</faultstring>
<faultactor>remote_service</faultactor>
<detail>
<common-detail>
<code>-303</code>
<message>Remote error processing component card request</message>
</common-detail>
</detail>
</fault>
</detail>
</soapenv:Fault>
</soapenv:Body>
</soapenv:Envelope>
这使得CXF生成的客户端异常下降:
javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"fault").
Expected elements are <{http://some.namespace.org}AnsBonusAutopayStatus>,<{http://some.namespace.org}AnsBonusAutopaySubscribe>,
...
<{http://some.namespace.org}fault>
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:603)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:244)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:239)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1009)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:446)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:427)
at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71)
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:240)
at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:123)
...
AFAIU在这个stacktrace中,unmarshaller希望fault元素有特定的命名空间声明,但它没有。
CXF为exception生成了类,它的faultInfo(没有任何更改)类似于:
Fault Class:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"faultcode",
"faultstring",
"faultactor",
"detail"
})
@XmlRootElement(name = "fault")
public class Fault {
@XmlElement(required = true)
protected String faultcode;
...
Fault_Exception类:
@WebFault(name = "fault", targetNamespace = "http://some.namespace.org")
public class Fault_Exception extends Exception {
private Fault fault;
public Fault_Exception() {
super();
}
...
<wsdl:message name="Fault">
<wsdl:part name="fault" element="fault"/>
</wsdl:message>
<xs:element name="fault">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="faultcode">...</xs:element>
<xs:element name="faultstring">...</xs:element>
<xs:element name="faultactor">...</xs:element>
<xs:element minOccurs="0" name="detail">...</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<wsdl:operation name="BonusConversionState">
<wsdl:input name="BonusConversionStateRequest" message="tns:BonusConversionStateRequest"/>
<wsdl:output name="BonusConversionStateResponse" message="tns:BonusConversionStateResponse"/>
<wsdl:fault name="Fault" message="tns:Fault"/>
</wsdl:operation>
WSDL根元素:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions targetNamespace="http://some.namespace.org"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://some.namespace.org"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
可以提供更多其他信息。
提前感谢!
在“调查”中,我发现NullPointerException(我在“测试解决方案”中提到过)不是我错误操作的结果。这是CXF的一个bug:
就过失而言,这似乎是服务部门不遵守自己的合同的情况。虽然您可能无法控制服务,但这值得与服务提供商进行讨论。
客户机抱怨的fault元素是第一个“detail”元素的直接子元素。
根据异常消息,“detail”的第一个子元素应该是(假设目标命名空间为“http://some.namespace.org”)AnsBonusAutopayStatus或AnsBonusAutopaySubscribe,而不是{}fault元素。
我尝试使用SOAP服务,用maven cxf-codegen-plugin生成存根。大多数服务都很好,除了一个难看的服务。在这种情况下,当被调用时,服务发送一个正确的响应,但是我生成的存根无法解组它,从而生成一个异常,比如(我用一个类似urlx的名称替换了URL,以简化) : javax.xml.ws.soap。SOAPFaultException:解组错误:意外元素(uri:“url3”,loc
问题内容: 从xml解组时遇到异常 组类没有任何注释,而group.xml仅包含数据。 有什么原因吗? 问题答案: 看起来您的XML文档具有根元素“ Group”而不是“ group”。您可以: 将XML上的根元素更改为“ group” 将注释@XmlRootElement(name =“ Group”)添加到Group类。
从xml反编组时遇到异常 } 我为systemUnit类添加了注释@xmlRootelement(name=“systemUnit”)。 有人能帮我解决这个问题吗
嗨,我已经使用wsimport从WSDL生成了java类,但是我已经将响应写到了一个文件*.xml中。但是现在我想读取这个xml文件并填充已经生成的java类。 我试过: XML如下所示: 或者我能做什么?
你可以在这个网站找到很多这样的问题,但没有一个解决了我的问题。 这是我的XML: 我已经使用XJC编译器创建了Jaxb类,创建的文件如下所示:
在我将目标Android SDK从30.0.3更新到31.0.0后,我开始出现以下2个警告: 此版本只能理解最多 2 个 SDK 的 XML 版本,但遇到版本 3 的 SDK XML 文件。如果您使用在不同时间发布的 Android Studio 版本和命令行工具,则可能会发生这种情况。 警告:意外元素(uri:“”,local:“base extension”)。预期元素为 我试图更新所有的库,