webservice客户端命名空间

本文档介绍了在Webservice通讯中遇到命名空间不统一问题的解决方案。针对其他系统提供的服务命名空间不符合全系统规范的情况,详细阐述了如何修改客户端的命名空间,包括请求类和返回类的命名空间调整步骤,以解决调用异常问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:开发背景

webservice通讯时经常会遇到命名空间不符的情况,比如全系统统一使用一套规范,但是某些系统提供的服务命名不是很统一,由其提供的wsdl文件生成的客户端的命名空间也随之不统一,因此就需要调用方开发客户端时修改命名空间。

1:全系统统一使用的命名空间

<soapenv:envelope
xmlns:soapenv="http://shcemas.xnlsoap.org/soap/envelope/"
xmlns:s="http://127.0.0.1:8888/UPB"
xmlns:tns="http://127.0.0.1:8888/UPB/wsdl">
	<soapenv:Header/>
	<soapenv:Body>
		<tns:ReqS00000000001>
			<s:ReqSysHead>
				<s:SvcId>?</s:SvcId>
				<s:SvcScn>?</s:SvcScn>
			</s:ReqSysHead>
		</tns:ReqS00000000001>
	</soapenv:Body>
</soapenv:envelope>

2:其他系统提供的webservice服务

<soapenv:envelope
xmlns:soapenv="http://shcemas.xnlsoap.org/soap/envelope/"
xmlns:upb="http://127.0.0.1:8888/UPB"
	<soapenv:Header/>
	<soapenv:Body>
		<upb:ReqS00000000001>
			<upb:ReqSysHead>
				<upb:SvcId>?</upb:SvcId>
				<upb:SvcScn>?</upb:SvcScn>
			</upb:ReqSysHead>
		</upb:ReqS00000000001>
	</soapenv:Body>
</soapenv:envelope>

由以上两图可见,其他系统提供的服务文件的命名空间少了一层【请求类的命名空间】,而且属性的命名空间也不标准

在 http://blog.youkuaiyun.com/tangmingxin0529/article/details/79310256 这篇文章中有客户端代码的生成过程介绍。

二:客户端命名空间修改

1:请求类的命名空间修改

Stub类中有webservice服务的调用方法,其参数类的类定义处既有请求类的命名空间设置。

public static class ReqS00000000001 implements
	org.apache.axis2.databinding.ADBBean{
   public static final javax.xml.namespace.QName MY_QNAME=
		new javax.xml.namespace.QName(
		"http://127.0.0.1:8888/UPB","ReqS00000000001","ns1")
	}

从最初的客户端代码可见,请求类的命名空间为UPB,这里需要先将其修改为

public static class ReqS00000000001 implements
	org.apache.axis2.databinding.ADBBean{
   public static final javax.xml.namespace.QName MY_QNAME=
		new javax.xml.namespace.QName(
		"http://127.0.0.1:8888/UPB/wsdl","ReqS00000000001","tns")
	}

这样请求类的命名空间暂时变成了wsdl,并且命名空间会由两个变成3个

2:返回类的命名空间修改

最初的返回类命名空间也为UPB,这样在调用服务返回是会报Unexpected subelement RspS00000000001异常

while(!reader.isEndElement()){
	if(reader.isStartElement()){
	if(reader.isStartElement()&& new javax.xml.namespace.QName(
	"http://127.0.0.1:8888/UPB","RspS00000000001").equals(reader.getName())){
	object.setRspS00000000001(RspS00000000001Type.Factory.parse(reader));}
返回类的命名空间修改并不在其类的定义处修改,而是在
public static class Factory{
	public static RspS00000000001 parse(javax.xml.stream.XMLStreamReader reader){

这个方法中进行修改的,Factory会进行命名空间的校验及字段的校验

public static class Factory{
	public static RspS00000000001 parse(javax.xml.stream.XMLStreamReader reader){
	......
	while(!reader.isEndElement()){
	if(reader.isStartElement()){
	if(reader.isStartElement()&& new javax.xml.namespace.QName(
	"http://127.0.0.1:8888/UPB/wsdl","RspS00000000001").equals(reader.getName())){
	object.setRspS00000000001(RspS00000000001Type.Factory.parse(reader));}
	......

3:截止目前,请求类和返回类的命名空间都已经进行了修改,但是这只能在原有的两层命名空间上加上第三个命名空间,并不是最终的统一样式

private org.apache.axiom.soap.SOAPEnvelope toEnvelope(
	  org.apache.axiom.soap.SOAPFactory factory,
	  .......ReqS00000000001  param,
	  boolean optimizeContent) throws org.apache.axis2.AxisFault{
	  try{
		org.apache.axiom.soap.SOAPEnvelope emptyEnvelope=factory.getDefaultEnvelope();
		//-------------------手动添加---------------------
		emptyEnvelope.declareNamespace(
			"http://127.0.0.1:8888/UPB/wsdl","tns";
		emptyEnvelope.declareNamespace(
			"http://127.0.0.1:8888/UPB","s"
			);
		//-------------------手动添加---------------------
添加这几行代码之后,所以的命名空间为wsdl都是转换成tns,所以属性的命名空间upb都会转换成s。现在即为全系统统一的标准soap报文格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值