CXF
发布时间:2020-12-17 01:09:45 所属栏目:安全 来源:网络整理
导读:有两种方式用 CXF 写 WebService 1、JAVA FIRST ????? 即先写java类,然后通过javax.ws包的注解将java类发布为WebService 2、WSDL FIRST ????? 先写WSDL文件描述,然后用CXF的wsdl2java工具生成WebService的java类,最后加入业务逻辑 javax.xml.ws 包 javax.
有两种方式用 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="22222111"? //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="22222111SoapBinding" 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="22222111"> //指定具体实现时的webservice的端口,有具体实现类的@WebService注解的 portName 属性指定 ??? <wsdl:port binding="tns:22222111SoapBinding" name="22222222"> ????? <soap:address location="http://localhost:9000/siInterfaceForAdc" /> ??? </wsdl:port> ? </wsdl:service> </wsdl:definitions> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |