WSDL生成SOAP请求时OTMSS元素命名空间去除的修改咨询
解决wsimport生成SOAP请求时OTMSS元素带命名空间的问题
我来帮你搞定这个命名空间的困扰——这确实是JAX-WS工具链里常见的坑,尤其是当服务端对XML格式要求特别严格的时候。结合你的情况,要让生成的请求里OTMSS元素不带命名空间,需要从WSDL的几个关键部分入手修改:
1. 调整XSD类型定义的命名空间
首先看WSDL里的<types>节点,里面的XSD schema是定义OTMSS元素的核心。原来的schema大概率给OTMSS指定了命名空间(就是你看到的http://xmlns.oracle.com/SS_jws/SS/SS),我们需要把它移到无命名空间:
修改前的XSD片段:
<xs:schema targetNamespace="http://xmlns.oracle.com/SS_jws/SS/SS" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xs:element name="OTMSS"> <!-- 元素结构定义 --> </xs:element> </xs:schema>
修改后的XSD片段:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified"> <xs:element name="OTMSS"> <!-- 元素结构定义 --> </xs:element> </xs:schema>
- 删掉
targetNamespace属性,让schema处于默认空命名空间 - 把
elementFormDefault改成unqualified,确保子元素(比如username、password)也不会自动带上命名空间
2. 修正WSDL消息和操作的引用
接下来要确保WSDL里的<message>和<operation>在引用OTMSS元素时,不带命名空间前缀:
修改前的消息定义:
<message name="OTMSSRequest"> <part name="parameters" element="ns2:OTMSS"/> </message>
修改后的消息定义:
<message name="OTMSSRequest"> <part name="parameters" element="OTMSS"/> </message>
- 同时记得删掉WSDL顶部和这个命名空间相关的前缀声明(比如
xmlns:ns2="http://xmlns.oracle.com/SS_jws/SS/SS"),避免工具链自动关联。
3. 用JAX-WS绑定文件强制规范(可选)
如果修改WSDL后生成的代码还是带命名空间,可以给wsimport加一个自定义绑定文件,强制指定元素的命名空间处理。创建一个jaxws-bindings.xml文件:
<jaxws:bindings xmlns:jaxws="http://java.sun.com/xml/ns/jaxws" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.0"> <!-- 绑定到目标schema(如果还没完全移除命名空间的话) --> <jaxws:bindings node="wsdl:definitions/wsdl:types/xs:schema[@targetNamespace='http://xmlns.oracle.com/SS_jws/SS/SS']"> <jxb:schemaBindings> <jxb:package name="your.package.name"/> <!-- 禁止自动添加命名空间相关的后缀 --> <jxb:nameXmlTransform> <jxb:elementName suffix=""/> <jxb:typeName suffix=""/> </jxb:nameXmlTransform> </jxb:schemaBindings> <!-- 明确指定OTMSS元素的绑定 --> <jxb:bindings node="//xs:element[@name='OTMSS']"> <jxb:property name="otmss"/> <jaxws:class name="OTMSS"/> </jxb:bindings> </jaxws:bindings> </jaxws:bindings>
然后在Ant的wsimport任务里加入这个绑定文件:
<wsimport wsdl="your.wsdl" destdir="gen-src" bindingfiles="jaxws-bindings.xml" verbose="true"/>
4. 验证生成的Java代码
最后检查生成的OTMSS.java类,确保@XmlRootElement注解没有指定namespace:
// 正确的写法 @XmlRootElement(name = "OTMSS") public class OTMSS { // 类内容 }
如果注解里有namespace="http://xmlns.oracle.com/SS_jws/SS/SS",说明WSDL的修改还没到位,需要回到第一步重新调整XSD的命名空间设置。
为什么SoapUI可以生成正确的请求?
SoapUI在解析WSDL时,会更“宽松”地处理无命名空间的元素,直接按照WSDL里的定义输出;而wsimport默认会把targetNamespace下的所有元素都加上命名空间前缀,除非明确将元素放在空命名空间里。
内容的提问来源于stack exchange,提问作者akorous
相关产品推荐
相关产品推荐

