JAX- RPC:获取错误"org.xml.sax.SAXException: WSWS3047E: Error: Cannot deserialize element"



在尝试修改现有的 wsdl 并更改操作的请求类型和响应类型时,我得到了以下内容。

我遵循的过程是:1. 修改 xsd2. 生成 Java Bean 骨架(无法更改它,因为它在多个地方被引用)

尝试的修复:1. 引用了多篇文章,并将 WSDL 更改为 elementFormDefault="unqualified"并重新生成支持文件。2.我尝试设置xmlns="以禁用该字段的命名空间。

WSDL(仅粘贴修改后的操作,原始的wswdl大约有52个操作)

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="ABCDEF" targetNamespace="http://managemyxyz.services.abc.def/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://managemyabc.services.abc.def/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd1="http://cat.abc.def/ABC/schema/">
    <wsdl:types>
    <xsd:schema targetNamespace="http://manageabc.services.abc.def/">
      <xsd:complexType name="NewType"/>
    </xsd:schema>
        <xsd:schema>
            <xsd:import namespace="http://cat.abc.def/ABC/schema/" schemaLocation="xsd/ABC.xsd">
            </xsd:import>
    </xsd:schema>
  <wsdl:message name="insertABCRequest">
    <wsdl:part name="insertABCRequest" type="xsd1:InsertABCItemRequestType"/>
  </wsdl:message>
  <wsdl:message name="insertABCItemResponse">
    <wsdl:part name="insertABCItemResponse" type="xsd1:InsertABCItemResponseType"/>
  </wsdl:message>
  <wsdl:portType name="ABCDEF">
    <wsdl:operation name="insertABC">
        <wsdl:input message="tns:insertABCItemRequest1"/>
        <wsdl:output message="tns:insertABCItemResponse1"/>
    </wsdl:operation>
  </wsdl:portType>
<wsdl:binding name="ABCSOAP" type="tns:ABC">
        <wsdl:operation name="insertABC">
    <soap:operation soapAction="http://manageabc.services.abc.def/insertABC"/>
    <wsdl:input>
        <soap:body use="literal"/>
    </wsdl:input>
    <wsdl:output>
        <soap:body use="literal"/>
    </wsdl:output>
</wsdl:operation>
</wsdl:binding>
 <wsdl:service name="ABC">
<wsdl:port binding="tns:ABCSOAP" name="ABCSOAP">
  <soap:address location="http://localhost:10039/.modulename.war/services/ABCSOAP"/>
</wsdl:port>

ABC.xsd

<element name="InsertABCRequest" type="Q1:InsertABCItemRequestType">
</element>
<complexType name="InsertABCItemRequestType">
    <sequence>
        <element name="abcdId" type="int"/>
        <element name="abcdCode" type="string"/>
        <element name="abcNumber" type="string"/>
    </sequence>
</complexType>
<element name="InsertABCItemResponse" type="Q1:InsertABCItemResponseType">
</element>
<complexType name="insertABCItemResponse">
    <sequence>
        <element name="responseHeader" type="Q1:ResponseCodeType"/>
    </sequence>
</complexType>

例外:

[11/28/14 13:21:20:240 IST] 000000af WebServicesSe E com.ibm.ws.webservices.engine.transport.http.WebServicesServlet doPost WSWS3227E:  Error: Exception:
                         WebServicesFault

faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
 faultString: org.xml.sax.SAXException: WSWS3047E: Error: Cannot deserialize element fieldName of bean com.abc.xyz.abc.InsertABCRequestType. 
Child element fieldName does not belong in namespace . 
Most likely, a third party web services platform has sent an incorrect SOAP message. Message being parsed: 
 faultActor: null
 faultDetail: 
org.xml.sax.SAXException: WSWS3047E: Error: Cannot deserialize element fieldName of bean com.abc.xyz.abc.InsertABCRequestType.
Child element InsertABCRequestType does not belong in namespace . 
Most likely, a third party web services platform has sent an incorrect SOAP message. Message being parsed: 
    at com.ibm.ws.webservices.engine.WebServicesFault.makeFault(WebServicesFault.java:300)
    at com.ibm.ws.webservices.engine.SOAPPart._getSOAPEnvelope(SOAPPart.java:1090)
    at com.ibm.ws.webservices.engine.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:628)
    at com.ibm.ws.webservices.engine.SOAPPart.getEnvelope(SOAPPart.java:656)
    at com.ibm.ws.webservices.engine.handlers.jaxrpc.JAXRPCHandlerChain.handleRequest(JAXRPCHandlerChain.java:301)
    at com.ibm.ws.webservices.engine.handlers.jaxrpc.JAXRPCHandler.invokeServerRequestHandler(JAXRPCHandler.java:516)
    at com.ibm.ws.webservices.engine.handlers.jaxrpc.JAXRPCHandler$1.invoke(JAXRPCHandler.java:381)
    at com.ibm.ws.webservices.engine.PivotHandlerWrapper.invoke(PivotHandlerWrapper.java:225)
    at com.ibm.ws.webservices.engine.WebServicesEngine.invoke(WebServicesEngine.java:336)
    at com.ibm.ws.webservices.engine.transport.http.WebServicesServlet.doPost(WebServicesServlet.java:1246)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
    at com.ibm.ws.webservices.engine.transport.http.WebServicesServletBase.service(WebServicesServletBase.java:344)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)

环境详情 :

服务器 : IBM WAS 7.0.0.31IDE : IBM RAD 8.5

如果需要任何其他信息,请告诉我。

@BK 伊丽莎白 - 感谢您的回复。根据当前的实现,wsdl 用于使用自上而下的方法生成 java bean,而不是您在评论中提到的自下而上的方法(毫无疑问,这是一种更好的方法)。

真正的问题是生成的 bean 是在容器级别作为共享库添加的,因为 bean 的对象是在多个模块之间传递的。因此,即使我在模块级别更新了 bean,但实际上加载了以前版本的服务 bean。在更新共享库时,我的更改开始反映,错误"WSWS3047E:错误:无法反序列化元素"得到解决"。


对于"WSWS3047E:错误:无法反序列化元素"错误,可以参考下面提到的链接,尽管我的问题有点不同。

http://www-01.ibm.com/support/docview.wss?uid=swg21220377

最新更新