Spring WebServiceTemplate错误地使用Xerces来解组XML响应

时间:2013-11-14 11:21:53

标签: cxf spring-ws xerces maven-jaxb2-plugin

我正在使用Spring WST并使用WCF SOAP 1.1 Web服务。我已经使用Apache的CXF Maven插件从WSDL生成Web服务客户端。当我检查生成的类时,它看起来已经被使用了JAXB,并且此时所有内容都是预期的。

但是,当我向Web服务发送请求时(通过Spring WST),响应对象使用Xerces ElementNSImpl来表示响应。

以下是发生什么事的一个例子;

  1. Apache CXF生成对象名称PersonResponseObject,PersonRequestObject
  2. 我填充PersonRequestObject并在Spring WST的帮助下提交
  3. WCF服务按预期返回内容(我可以将SOAP响应打印到控制台)但是在解组期间,PersonResponseObject注入了一个Xerces类型的ElementNSImpl类型。
  4. 在我看来,我需要在解组过程中明确强制使用JAXB但是我不确定这是否需要告诉Spring tenplate或其他地方。

    有谁熟悉这个问题,有什么建议吗? 返回XML的示例

    <?xml version="1.0" encoding="utf-8"?>
    

    <PersonResponseObject xmlns="http://tempuri.org/">
      <PersonResponseObjectResult>
        <xs:schema xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:xs="http://www.w3.org/2001/XMLSchema" id="NewDataSet">
          <xs:element msdata:IsDataSet="true" msdata:UseCurrentLocale="true" name="NewDataSet">
            <xs:complexType>
              <xs:choice maxOccurs="unbounded" minOccurs="0">
                <xs:element name="Table">
                  <xs:complexType>
                    <xs:sequence>
                      <xs:element minOccurs="0" name="ActivityName" type="xs:string" />
                      <xs:element minOccurs="0" name="ActivityDesc" type="xs:string" />
                      <xs:element minOccurs="0" name="Activityid" type="xs:int" />
                      <xs:element minOccurs="0" name="code" type="xs:string" />
                      <xs:element minOccurs="0" name="Status" type="xs:string" />
                      <xs:element minOccurs="0" name="PlanDate" type="xs:string" />
                      <xs:element minOccurs="0" name="Duedate" type="xs:string" />
                      <xs:element minOccurs="0" name="IsRequired" type="xs:unsignedByte" />
                      <xs:element minOccurs="0" name="ReqStatus" type="xs:int" />
                    </xs:sequence>
                  </xs:complexType>
                </xs:element>
              </xs:choice>
            </xs:complexType>
          </xs:element>
        </xs:schema>
        <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
          <NewDataSet xmlns="">
    

1 个答案:

答案 0 :(得分:0)

这是一个疯狂的混合XML。它返回一些XML,其中嵌套了一个架构。这意味着XML内容是动态的,可能(谷歌搜索看起来像是返回任意关系数据库数据)。我怀疑你使用开箱即用的JAXB会有很多运气。至少,您需要将一些返回的模式保存到XML文件,然后为它们生成新的JAXB对象。