基于契约优先编写CXF的webservice
wsdl中增加HEADER,传递一个User对象
使用注解添加Interceptor
第一步:编写xsd
<?xml version="1.0" encoding="UTF-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.org/cal" xmlns:tns="http://www.example.org/cal" elementFormDefault="unqualified"> <xsd:element name="add" type="tns:add"/> <xsd:element name="addResponse" type="tns:addResponse"/> <!-- 头信息 --> <xsd:element name="license" type="tns:user"></xsd:element> <xsd:complexType name="add"> <xsd:sequence> <xsd:element name="num1" type="xsd:int"/> <xsd:element name="num2" type="xsd:int"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="addResponse"> <xsd:sequence> <xsd:element name="result" type="xsd:long"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="user"> <xsd:sequence> <xsd:element name="name" type="xsd:string"/> <xsd:element name="pwd" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
第二步,编写wsdl
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://www.example.org/cal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="CalWsService" targetNamespace="http://www.example.org/cal"> <wsdl:types> <xsd:schema targetNamespace="http://www.example.org/cal"> <xsd:include schemaLocation="cal.xsd"></xsd:include> </xsd:schema> </wsdl:types> <!-- 头信息 --> <wsdl:message name="license"> <wsdl:part name="license" element="tns:license"></wsdl:part> </wsdl:message> <wsdl:message name="add"> <wsdl:part element="tns:add" name="parameters"/> </wsdl:message> <wsdl:message name="addResponse"> <wsdl:part element="tns:addResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="ICalService"> <wsdl:operation name="add"> <wsdl:input message="tns:add"/> <wsdl:output message="tns:addResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="calSOAP" type="tns:ICalService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="add"> <wsdl:input> <soap:body use="literal"/> <!-- header --> <soap:header use="literal" part="license" message="tns:license"></soap:header> </wsdl:input> <wsdl:output> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="CalWsService"> <wsdl:port binding="tns:calSOAP" name="calSOAPPart"> <soap:address location="http://localhost:8888/cxf/ws"/> </wsdl:port> </wsdl:service> </wsdl:definitions>
第三步:将wsdl通过CXF的wsdl2java命令转换为本地java文件(只要接口即可)
POM.xml中增加wsdl2java的插件命令
<build> <plugins> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <executions> <execution> <id>generate-sources</id> <phase>compile</phase> <configuration> <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <!-- 本地wsdl文件地址 --> <wsdl>src/main/resources/META-INF/wsdl/cal.wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
模型
package com.hqh.ws.cxf.model; public class User { private String name; private String pwd; public User() { super(); } public User(String name, String pwd) { super(); this.name = name; this.pwd = pwd; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User [name=" + name + ", pwd=" + pwd + "]"; } }
删除接口中的@XmlSeeAlso({ObjectFactory.class})和注解中定义的class属性
在add()上手动加入头信息 @WebParam(name="license", header=true) User user
package org.example.cal; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.ws.RequestWrapper; import javax.xml.ws.ResponseWrapper; import com.hqh.ws.cxf.model.User; /** * This class was generated by Apache CXF 2.6.0 * 2013-08-17T11:29:27.810+08:00 * Generated source version: 2.6.0 * */ @WebService(targetNamespace = "http://www.example.org/cal", name = "ICalService") public interface ICalService { @WebResult(name = "result", targetNamespace = "") @RequestWrapper(localName = "add", targetNamespace = "http://www.example.org/cal") @WebMethod @ResponseWrapper(localName = "addResponse", targetNamespace = "http://www.example.org/cal") public long add( @WebParam(name = "num1", targetNamespace = "") int num1, @WebParam(name = "num2", targetNamespace = "") int num2, //手动增加头信息 @WebParam(name="license", header=true) User user ); }
编写实现类
package org.example.cal; import javax.jws.WebService; import com.hqh.ws.cxf.model.User; @WebService(endpointInterface="org.example.cal.ICalService", serviceName="CalWsService", portName="calSOAPPart", targetNamespace="http://www.example.org/cal") public class CalServiceImpl implements ICalService { @Override public long add(int num1, int num2, User license) { //打印licenseInfo System.out.println(license); long result = num1 + num2; System.out.println(num1+"+"+num2+"="+result); return result; } }
使用CXF发布服务
package org.example.cal; import javax.xml.namespace.QName; import org.apache.cxf.jaxws.JaxWsServerFactoryBean; public class MyCXFServer { public static void main(String[] args) { JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean(); svrFactory.setAddress("http://localhost:8888/cxf/ws"); svrFactory.setServiceClass(ICalService.class); svrFactory.setServiceBean(new CalServiceImpl()); //必须显示定义WsdlLocation和ServiceName才能基于契约优先来发布webservice svrFactory.setWsdlLocation("src/main/resources/META-INF/wsdl/cal.wsdl"); svrFactory.setServiceName(new QName("http://www.example.org/cal","CalWsService")); //开启服务 svrFactory.create(); } }
客户端通过公布的wsdl的URL,使用wsdl2java转换为本地java文件
pom.xml中增加wsdl2java插件
<build> <plugins> <plugin> <groupId>org.apache.cxf</groupId> <artifactId>cxf-codegen-plugin</artifactId> <version>${cxf.version}</version> <executions> <execution> <id>generate-sources</id> <phase>compile</phase> <configuration> <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot> <wsdlOptions> <wsdlOption> <!-- 网络wsdl文件地址 --> <wsdl>http://localhost:8888/cxf/ws?wsdl</wsdl> </wsdlOption> </wsdlOptions> </configuration> <goals> <goal>wsdl2java</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
编写拦截器
package com.hqh.ws.cxf.interceptor; import java.util.List; import javax.xml.bind.JAXBException; import javax.xml.namespace.QName; import org.apache.cxf.binding.soap.SoapMessage; import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor; import org.apache.cxf.databinding.DataBinding; import org.apache.cxf.headers.Header; import org.apache.cxf.interceptor.Fault; import org.apache.cxf.jaxb.JAXBDataBinding; import org.apache.cxf.phase.Phase; import com.hqh.ws.cxf.model.User; public class LicenseOutInterceptorNew extends AbstractSoapInterceptor{ /** * 指定加入拦截器到某个阶段 * @param p */ public LicenseOutInterceptorNew() { super(Phase.WRITE); } @Override public void handleMessage(SoapMessage message) throws Fault { List<Header> headers = message.getHeaders(); System.out.println("headers.size:"+headers.size()); try { //创建QName String namespaceURI = "http://www.example.org/cal"; String localPart = "license"; String prefix = "ns"; QName qname = new QName(namespaceURI, localPart, prefix); //头信息为一个对象 User user = new User("root","root123"); //创建DataBinding DataBinding dataBinding = new JAXBDataBinding(User.class); //创建Header Header header = new Header(qname, user, dataBinding); //将header加入到SOAP头集合中 headers.add(header); } catch (JAXBException e) { e.printStackTrace(); throw new Fault(e); } } }
在客户端的服务接口上使用注解加入拦截器
package org.example.cal; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.xml.bind.annotation.XmlSeeAlso; import javax.xml.ws.RequestWrapper; import javax.xml.ws.ResponseWrapper; import org.apache.cxf.interceptor.InInterceptors; import org.apache.cxf.interceptor.OutInterceptors; /** * This class was generated by Apache CXF 2.6.0 * 2013-08-17T12:22:32.760+08:00 * Generated source version: 2.6.0 * */ @WebService(targetNamespace = "http://www.example.org/cal", name = "ICalService") @XmlSeeAlso({ObjectFactory.class}) //将LicenseOutInterceptorNew加入到out拦截器链中 @OutInterceptors (interceptors = {"com.hqh.ws.cxf.interceptor.LicenseOutInterceptorNew" }) public interface ICalService { @WebResult(name = "result", targetNamespace = "") @RequestWrapper(localName = "add", targetNamespace = "http://www.example.org/cal", className = "org.example.cal.Add") @WebMethod @ResponseWrapper(localName = "addResponse", targetNamespace = "http://www.example.org/cal", className = "org.example.cal.AddResponse") public long add( @WebParam(name = "num1", targetNamespace = "") int num1, @WebParam(name = "num2", targetNamespace = "") int num2 ); }
调用服务端提供的服务
/** * 基于契约优先的CXF webservice调用 */ @Test public void test04() { // ICalService service = new CalWsService().getCalSOAPPart(); // long ret = service.add(1, 11); // System.out.println(ret); JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); factory.setAddress("http://localhost:8888/cxf/ws?wsdl"); factory.setServiceClass(ICalService.class); ICalService service = (ICalService)factory.create(); long ret = service.add(11, 1); System.out.println(ret); }
客户端发出的消息与接收到的返回值:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Header> <ns:license xmlns:ns="http://www.example.org/cal"> <name>root</name> <pwd>root123</pwd> </ns:license> </soap:Header> <soap:Body> <ns2:add xmlns:ns2="http://www.example.org/cal"> <num1>11</num1> <num2>1</num2> </ns2:add> </soap:Body> </soap:Envelope>
-------------------------------------- 12
服务端处理结果:
User [name=root, pwd=root123] 11+1=12
相关推荐
这个实例会展示出以契约优先(或者可以说是WSDL优先)的方式开发CXF WebService服务,同时会整合spring框架,使用spring框架将服务发布到tomcat容器中,项目的构建会用Maven管理。
接口定义了服务的契约,而实现类提供了具体的功能。例如,我们可以在`WebServiceServer`目录下的类中看到服务的实现。 3. **调用Web Service**:对于客户端,`JaxWsProxyFactoryBean`可以帮助我们创建一个服务代理...
使用CXF的`@WebService`注解标记服务接口和实现类,定义服务契约和行为。例如: ```java @WebService public interface MyWebService { String sayHello(String name); } @Component @WebService(endpoint...
【标题】"CXF+Spring+Tomcat发布WebService"涉及的是使用Apache CXF框架与Spring框架结合,在Tomcat服务器上部署和消费Web服务的过程。这是一个常见的企业级应用开发场景,特别是对于实现基于SOAP协议的Web服务。...
本文将详细解析基于契约优先的WSDL(Web Services Description Language)的SOAP服务开发流程,同时结合“webservice_005_wsdl”这个压缩包中的文件,我们将深入探讨这一主题。 首先,WSDL是SOAP服务的核心组成部分...
标题“简单cxf+spring构建webservice服务”指的是使用Apache CXF框架与Spring框架结合来创建Web服务。Apache CXF是一个开源的Java框架,它允许开发者创建和消费各种Web服务,包括SOAP和RESTful风格。Spring框架则为...
- **WSDL(Web Services Description Language)**:CXF 使用 WSDL 文件来定义服务接口,允许服务提供者和消费者明确理解服务的契约。 - **JAX-WS(Java API for XML Web Services)**:CXF 实现了 JAX-WS 规范,...
"基于WSDL契约优先的Web Services"开发模式强调先定义服务的接口契约,再生成并实现服务。这种模式提高了服务的可预测性和互操作性。了解并熟练掌握WSDL、Web服务注解以及相关的开发工具,对于构建高质量、跨平台的...
在信息技术领域,WebService是一种基于开放标准的,用于不同系统间进行数据交换的技术。Apache CXF是一个流行的开源框架,它使得开发和部署Web服务变得简单而高效。本篇文章将深入探讨如何使用CXF来构建服务端的Web...
CXF这个名字是“CXF = XFire + ServiceMix”,两个早期项目的合并结果,旨在提供一个统一、高效的Web服务实现平台。在本文中,我们将深入探讨CXF的核心特性、用途、安装以及如何在Web服务开发中使用它。 1. **核心...
Spring的Web服务模块(Spring-WS)提供了基于契约优先的Web服务开发方式,而CXF与Spring的集成则可以让开发者利用Spring的丰富特性来管理和配置Web服务。 在"CXF+Spring WebService实例"中,我们需要完成以下步骤:...
- 使用CXF的代码第一(Code First)或契约优先(WSDL First)方式生成服务接口和服务实现。 - 在代码第一中,从Java类生成WSDL;在契约优先中,从WSDL生成Java类。 4. **依赖库** - `xalan-2.7.1.jar`:Xalan-...
1. **服务接口和实现**:通常会有一个Java接口定义服务的契约,以及一个实现类来提供服务的具体逻辑。 2. **WSDL文件**:Web服务描述语言,定义了服务的接口、消息格式和地址等信息,CXF可以根据接口自动生成WSDL。 ...
接口通常以`.xsd`文件形式定义服务契约,而实现则提供具体的业务逻辑。例如,我们可以创建一个名为`GreetingService`的接口,其中包含一个`sayHello`方法: ```xml <!-- greeting.xsd --> ``` 接着,编写对应...
【标题】:“WebService+CXF+Spring”是一个关于在Java环境中使用Apache CXF框架与Spring框架集成实现Web服务的专题。Apache CXF是一个开源的Web服务框架,它允许开发人员创建和部署SOAP和RESTful Web服务。Spring...
Apache CXF是一个强大的开源框架,用于构建和消费基于SOAP和REST风格的WebService。它不仅支持JAX-WS规范,还支持JAX-RS(Java API for RESTful Web Services),这使其能够同时满足传统SOAP服务和现代RESTful服务的...
总结,开发和使用CXF实现的WebService涉及到服务的定义、发布、以及客户端的生成。关键步骤包括设置服务器环境、配置服务契约、实现服务逻辑,以及根据服务URL或WSDL生成客户端代码。理解并熟练掌握这些步骤对于进行...
- **契约优先或代码优先**:客户端开发可以选择契约优先(基于WSDL生成客户端代码)或代码优先(基于Java接口生成WSDL)的方式。 ### 4. RESTful服务与CXF 除了传统的SOAP服务,CXF还支持RESTful API的开发。你可以...
它允许开发者以编程方式或通过契约优先(合同优先)的方式创建Web服务,后者依赖于WSDL(Web服务描述语言)文件。 **3. 创建CXF Web服务** 创建CXF Web服务的第一步是定义服务接口和实现。接口定义了服务提供的操作...
Spring-WS是基于契约优先的,这意味着服务是根据WSDL文档定义的。它提供了动态代理、AOP(面向切面编程)集成以及与其他Spring功能的无缝连接。 4. **JAX-WS**:Java API for XML Web Services (JAX-WS) 是Java平台...