前面提到用cxf对.net进行调用时的命名空间的问题,由于当时时间比较紧,没细致地进行总结,这次对这个命名空间进行一个较为细致的总结一下.
有两种类型的命名空间,一是targetNamespace,另外一个是namespace,其实他们都是用来进行名称区分的.targetNamespace一般进行整个wsdl的名称区分,所以一般是在对应的接口中进行声明,比如:
@WebService(targetNamespace= "http://soap.interfaces.ssa.huawei.com")
publicinterface ICorePlat {}
而namespace一般用来对复杂的参数进行命名的,而复杂的参数在java中通常就是bean了,在bean的同一个目录可以建立一个叫package-info.java的类,在该类中通过注解的方式加入namespace,示例如下:
@javax.xml.bind.annotation.XmlSchema(namespace= "http://soap.interfaces.ssa.huawei.com", elementFormDefault =javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.feinno.gdp.promgr.ws.client;
那么如果有多个namespace怎么办呢?这就需要多建几个目录,分别加入package-info.java文件就行了.
这个package-info.java的多少与wsdl文档中的参数类型以及你所需要的调用的接口有关.
比如一个wsdl文档中有10个方法,你可能只需要一个方法,则如果这个方法有复杂的参数,则可能就只需要建立一个package-info.java就行了,而如果都是标准的参数的话,这个就可以不用建立了.
比如针对下面的sendSMS就去,从字面上也看出其是一个复杂的的参数类型,在第一个参数是的type=”s1:InfoHeader”,从这个可以看见,s1指向了另外的一个命名空间,所以需要对InfoHeader这个bean的目录中建立一个package-info.java这样的类文件,将命名空间进行写入即可.
<