Java SOAP响应包含xmlns="&引用;在<;项目>;对于复杂类型

Java SOAP响应包含xmlns="&引用;在<;项目>;对于复杂类型,java,soap,axis,Java,Soap,Axis,我使用Axis-1.4在java中实现了web服务,以搜索从我的应用程序创建的会话 像 返回复杂类型map>的findByName(name) 因此,每当我调用webservice时,它都会以复杂类型返回结果。外部映射键将表示我为特定名称获得的数字记录,内部映射将包含基于我的应用程序配置的键和值 当我收到响应时,返回complextype,它包含在与xmlns=”“值为空之间 我面临的问题是xmlns的值不能为空,这导致客户端响应解析失败。所需的值是xmlns=”http://xml.apach

我使用Axis-1.4在java中实现了web服务,以搜索从我的应用程序创建的会话

返回复杂类型map>的findByName(name)

因此,每当我调用webservice时,它都会以复杂类型返回结果。外部映射键将表示我为特定名称获得的数字记录,内部映射将包含基于我的应用程序配置的键和值

当我收到响应时,返回complextype,它包含在
xmlns=”“
值为空之间

我面临的问题是
xmlns
的值不能为空,这导致客户端响应解析失败。所需的值是
xmlns=”http://xml.apache.org/xml-soap“

这是我得到的答复

<findByNameResponse xmlns="http://session.provider"> 
  <findByNameReturn xsi:type="ns1:Map" xmlns:ns1="http://xml.apache.org  /xml-soap">
    <item xmlns="">
     <key xsi:type="xsd:string">1</key>
     <value xsi:type="ns1:Map">
     <item>
        <key xsi:type="xsd:string">username</key>
       <value xsi:type="xsd:string">myname</value>
     </item>
     </value>
    </item>
</findByNameReturn>
</findByNameResponse>

1.
用户名
我的名字
具有findByName的
的wsdd是:

<ns3:operation name="findByName" qname="ns1:findByName" returnQName="ns1:findByNameReturn" returnType="ns2:Map" soapAction="" xmlns:ns1="http://session.provider" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:ns3="http://xml.apache.org/axis/wsdd/">
   <ns3:parameter qname="ns1:name" type="xsd:string" xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
</ns3:operation>

我还查看了axis-1.4.jar和jaxrpc.jar的源代码,从中我发现RPCParameter在内部发生了更改。还发现
所以,我不知道我的wsdd文件是否有问题,或者它是axis本身的bug,或者解决这个问题的任何解决方法?

我解决了这个问题,所以你可以编写一个类似BasicHandler的 并从属性中删除如下内容

if(originalNodeName.equalsIgnoreCase("item")){
     if (childNode instanceof Element){
          Element element = (Element) childNode;
          final String xmlns = element.getAttribute("xmlns");
          if (xmlns != null && xmlns.isEmpty()){
             element.removeAttribute("xmlns");
          }
      }
}
但不记得了,你应该用循环深入Dom树


希望这对你有帮助。

我解决了这个问题,所以你可以写一个像 并从属性中删除如下内容

if(originalNodeName.equalsIgnoreCase("item")){
     if (childNode instanceof Element){
          Element element = (Element) childNode;
          final String xmlns = element.getAttribute("xmlns");
          if (xmlns != null && xmlns.isEmpty()){
             element.removeAttribute("xmlns");
          }
      }
}
但不记得了,你应该用循环深入Dom树


希望这有帮助。

“所需值为xmlns=”“”-为什么您的客户要求它是一个特定的名称空间?对我来说,这听起来像一个破碎的客户。。。或者你把它搞错了。谢谢@JonSkeet,我也这么认为,因为我们有多个具有不同wsdl的Web服务,当客户端同时加载所有这些服务时,它们也面临名称空间冲突。但我仍然需要修复它:(“并且所需的值是xmlns=”“”-为什么你的客户端要求它是一个特定的名称空间?对我来说,这听起来像是一个非常坏的客户端…或者你误判了它。感谢@JonSkeet,我也这么认为,因为我们有多个具有不同wsdl的Web服务,当客户端同时加载所有服务时,它们也面临名称空间冲突。但我仍然必须修复它:(。