CXF

来源:互联网 发布:网络大V发布谣言 编辑:程序博客网 时间:2024/06/03 09:26
有两种方式用 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


有两种方式用 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 进行转换

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:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="result" type="tns:AdcSiResponse" />
</xs:sequence>
</xs:complexType>

</xs:element>
<xs:complexType name="AdcSiRequest">
<xs:sequence>
<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:sequence>
</xs:complexType>
<xs:complexType name="AdcSiResponse">
<xs:sequence>

<xs:element minOccurs="0" name="BizCode" type="xs:string" />
<xs:element minOccurs="0" name="TransID" type="xs:string" />
<xs:element name="ActionCode" type="xs:int" />
<xs:element minOccurs="0" name="TimeStamp" type="xs:string" />
<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="ResultCode" type="xs:string" />
<xs:element minOccurs="0" name="ResultMsg" type="xs:string" />
<xs:element minOccurs="0" name="SvcCont" type="xs:string" />
</xs:sequence>
</xs:complexType>
</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">
    </wsdl:part>
  </wsdl:message>
//定义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 方法对其重命名
    <wsdl:operation name="adcSiInterface">
      <soap12:operation soapAction="http://adc.siinterface.com/adcSiInterface" style="document" />
      <wsdl:input name="adcSiInterface">
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output name="adcSiInterfaceResponse">
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>

  </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>
原创粉丝点击