微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CXF

有两种方式用 CXF 写 WebService
1、JAVA FirsT
      即先写java类,然后通过javax.ws包的注解将java类发布为WebService
2、WSDL FirsT
      先写WSDL文件描述,然后用CXF的wsdl2java工具生成WebService的java类,最后加入业务逻辑

javax.xml.ws 包
javax.xml.ws包在JAVA 6中被正式引入到J2SE版本中,在JAVA5的时候,还是作为J2EE中的内容
javax.xml.ws被包含在CXF的geronimo-jaxws_2.1_spec-1.0.jar包
1、该包中的 javax.xml.ws.BindingType 注解可以用来配置WSDL文件中 <wsdl:binding>部分的<soap:binding>,BindingType 可选值有以下几种:SOAPBinding.soAP11HTTP_BINDING,SOAPBinding.soAP12HTTP_BINDING,HTTPBinding.HTTP_BINDING
当 BindingType 的值为 SOAPBinding.soAP12HTTP_BINDING 时,生成的WSDL中<wsdl:binding>的内容如下:<wsdl:binding ... ><soap12:binding ...>
BindingType 用来修饰 WebService接口的实现类
2、javax.jws包
javax.jws包要注意以下注解
1、WebMethod 用来注解WebService接口要向外公开的方法
只有被标注为 WebMethod 的方法,才会公开给外部访问。
2、WebParam 用来注解上述所讲的方法的参数,该注解的 name 属性对应于WSDL中相应方法的参数的name属性
WebParam.Mode 属性用来指定?
3、WebResult 用来注解上述所描述的方法的返回值,该注解的 name 属性对应于WSDL中相应方法返回值的name属性
4、WebService 用来对类和接口进行注解。当接口和其实现类被WebService注解之后才能成为一个WebService。
endpointInterface 属性,一般都作用于接口的实现类上,且其值就是该实现类的接口的全路径。
name 属性用来指定 WebService的name,
对应于<wsdl:deFinitions>的name属性
serviceName 属性用来做指定公开的WebService的服务名,对应于WSDL中 <wsdl:service> 的name
portName 属性用来指定WSDL中生成出来的
<wsdl:port>的name属性
wsdlLocation 属性用来指定WebService类所匹配的WSDL文件的路径,如果不指定这个,那么通过WebserviceName?wsdl生成出来的wsdl是CXF自己产生的,如果指定了,那么通过WebserviceName?wsdl生成的wsdl就是wsdlLocation 所指向的文件内容
以上属性全作用于类和接口上
targetNamespace 用来指定WebService的WSDL的 targetNamespace 属性,该属性可以用于接口和类上,也可以作用于endpoint 上
JAXB :javax.xml.bind 包
javax.xml.bind包用来提供将java bean和xml之间进行转换的支持
通过 JAXB 中的 Marshaller 和 Unmarshaller 可以将xml和java bean 进行转换
CXF WebService
WSDL文件理解
<?xml version='1.0' encoding='UTF-8'?>
<wsdl:deFinitions 
//webservice的名称,在接口实现类的 @WebService 注解 的serviceName属性可以指定这个值
name="11111111" 
//webservice的targetNamespace值,通过对 接口和实现类的 @WebService 的 targetNamespace属性可以指定,但是如果在接口和实现类中指定了不同的 targetNamespace,那么在生成的WSDL文件中,实现类中指定的 targetNamespace 会覆盖接口中的值
targetNamespace="http://adc.siinterface.com" 
xmlns:ns1="http://schemas.xmlsoap.org/soap/http" 
//CXF 中认是SOAP1.1,如果要使用SOAP1.2可以通过使用 @BindingType 注解来明确指定所要采用的SOAP协议,@BindingType注解在接口和接口的实现类中都可以使用,但是实现类指定的值会覆盖接口指定的值
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" 
xmlns:tns="http://adc.siinterface.com" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
/////定义使用到的数据类型。一个数据类型,就是一个类。数据类型分为基本类型和复杂类型,基本类型可以通过WSDL的基本类型指定,符合类型就要在此定义。
<wsdl:types>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://adc.siinterface.com" xmlns:tns="http://adc.siinterface.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="adcSiInterface">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="request" type="tns:AdcSiRequest" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="adcSiInterfaceResponse">
<xs:element minOccurs="0" name="result" type="tns:AdcSiResponse" />
<xs:complexType name="AdcSiRequest">
<xs:element minOccurs="0" name="BizCode" type="xs:string" />
<xs:element minOccurs="0" name="TransID" type="xs:string" />
<xs:element minOccurs="0" name="TimeStamp" type="xs:string" />
<xs:element name="ActionCode" type="xs:int" />
<xs:element minOccurs="0" name="SIAppID" type="xs:string" />
<xs:element name="TestFlag" type="xs:int" />
<xs:element name="Dealkind" type="xs:int" />
<xs:element name="Priority" type="xs:int" />
<xs:element minOccurs="0" name="Version" type="xs:string" />
<xs:element minOccurs="0" name="SvcCont" type="xs:string" />
<xs:complexType name="AdcSiResponse">
<xs:element minOccurs="0" name="ResultCode" type="xs:string" />
<xs:element minOccurs="0" name="ResultMsg" type="xs:string" />
</xs:schema>
</wsdl:types>
//定义 webservice 所公开的方法的参数
  <wsdl:message name="adcSiInterface">
    <wsdl:part element="tns:adcSiInterface" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="adcSiInterfaceResponse">
    <wsdl:part element="tns:adcSiInterfaceResponse" name="parameters">
//定义webservice所对应的接口。可以这么理解:port是一个具体接口,portType就是接口类型
//一个具体的webservice是一个具体的类,那么类的类型就是这个具体的类所实现的接口
//这部分的值,可以通过作用在webservice接口上的 @WebService 注解的 name 属性指定。
//前面提到过 @WebService 注解既可以使用在接口上,也可以使用在接口的实现类上,但是使用在接口上的时候
//其 name 属性就是portType的值,而使用在接口实现类上时,其name属性则无具体意义
  <wsdl:portType name="44444444">
//portType定义的是接口,通过@WebService 的name属性指定,而operation定义的则是接口的操作(也就是接口的方法),通过@WebMethod指定
//所以WebMethod只会在接口中定义的才有效,实现类中所定义的不会覆盖接口中所定义的
    <wsdl:operation name="adcSiInterface">
//定义接口的输入输出参数,在WebService中,一个message就是指operation所捎来的和提供的数据包。
//定义输入,引用了上面的message
      <wsdl:input message="tns:adcSiInterface" name="adcSiInterface">
    </wsdl:input>
//定义输出,引用了上面定义的message
      <wsdl:output message="tns:adcSiInterfaceResponse" name="adcSiInterfaceResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
//绑定指的是将接口的具体实现和具体的实施技术进行绑定。
//所以bingding的 type 属性是 portType 
//而且由于要涉及到具体实现的细节,所以这里的方法是实现类中的具体方法,而且,即便想用 @WebMethod 对其进行改名,也不会成功。
  <wsdl:binding name="11111111SoapBinding" type="tns:44444444">
    <soap12:binding style="document" transport="http://www.w3.org/2003/05/soap/bindings/HTTP/" />
//实现类的方法名称,无法通过实现类的 @WebMethod 方法对其重命名
      <soap12:operation soapAction="http://adc.siinterface.com/adcSiInterface" style="document" />
      <wsdl:input name="adcSiInterface">
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output name="adcSiInterfaceResponse">
      </wsdl:output>
  </wsdl:binding>
//这个值也可以在接口实现类的 @WebService 注解 的serviceName属性可以指定这个值
  <wsdl:service name="11111111">
//指定具体实现时的webservice的端口,有具体实现类的@WebService注解的 portName 属性指定
    <wsdl:port binding="tns:11111111SoapBinding" name="22222222">
      <soap:address location="http://localhost:9000/siInterfaceForAdc" />
    </wsdl:port>
  </wsdl:service>
</wsdl:deFinitions>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐