`
schy_hqh
  • 浏览: 558423 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

(四)CXF基于契约优先实现webservice

 
阅读更多

基于契约优先编写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

 

 

 

 

 

分享到:
评论

相关推荐

    CXF契约优先开发方式Demo

    这个实例会展示出以契约优先(或者可以说是WSDL优先)的方式开发CXF WebService服务,同时会整合spring框架,使用spring框架将服务发布到tomcat容器中,项目的构建会用Maven管理。

    spring CXF集成,实现webservice(包含https)

    接口定义了服务的契约,而实现类提供了具体的功能。例如,我们可以在`WebServiceServer`目录下的类中看到服务的实现。 3. **调用Web Service**:对于客户端,`JaxWsProxyFactoryBean`可以帮助我们创建一个服务代理...

    CXF2.7+Spring3 Java WebService 集成用例

    使用CXF的`@WebService`注解标记服务接口和实现类,定义服务契约和行为。例如: ```java @WebService public interface MyWebService { String sayHello(String name); } @Component @WebService(endpoint...

    CXF+Spring+Tomcat发布WebService

    【标题】"CXF+Spring+Tomcat发布WebService"涉及的是使用Apache CXF框架与Spring框架结合,在Tomcat服务器上部署和消费Web服务的过程。这是一个常见的企业级应用开发场景,特别是对于实现基于SOAP协议的Web服务。...

    soap基于契约优先WSDL的简单开发流程

    本文将详细解析基于契约优先的WSDL(Web Services Description Language)的SOAP服务开发流程,同时结合“webservice_005_wsdl”这个压缩包中的文件,我们将深入探讨这一主题。 首先,WSDL是SOAP服务的核心组成部分...

    简单cxf+spring构建webservice服务

    标题“简单cxf+spring构建webservice服务”指的是使用Apache CXF框架与Spring框架结合来创建Web服务。Apache CXF是一个开源的Java框架,它允许开发者创建和消费各种Web服务,包括SOAP和RESTful风格。Spring框架则为...

    webservice-cxf-2.3.5

    - **WSDL(Web Services Description Language)**:CXF 使用 WSDL 文件来定义服务接口,允许服务提供者和消费者明确理解服务的契约。 - **JAX-WS(Java API for XML Web Services)**:CXF 实现了 JAX-WS 规范,...

    基于WSDL契约优先的web services服务器端和客户端开发方式

    "基于WSDL契约优先的Web Services"开发模式强调先定义服务的接口契约,再生成并实现服务。这种模式提高了服务的可预测性和互操作性。了解并熟练掌握WSDL、Web服务注解以及相关的开发工具,对于构建高质量、跨平台的...

    WebService之CXF(一、服务端的使用)

    在信息技术领域,WebService是一种基于开放标准的,用于不同系统间进行数据交换的技术。Apache CXF是一个流行的开源框架,它使得开发和部署Web服务变得简单而高效。本篇文章将深入探讨如何使用CXF来构建服务端的Web...

    CXF依赖包,CXF依赖包,webservice

    CXF这个名字是“CXF = XFire + ServiceMix”,两个早期项目的合并结果,旨在提供一个统一、高效的Web服务实现平台。在本文中,我们将深入探讨CXF的核心特性、用途、安装以及如何在Web服务开发中使用它。 1. **核心...

    cxf+spring webService实例

    Spring的Web服务模块(Spring-WS)提供了基于契约优先的Web服务开发方式,而CXF与Spring的集成则可以让开发者利用Spring的丰富特性来管理和配置Web服务。 在"CXF+Spring WebService实例"中,我们需要完成以下步骤:...

    CXF webservice初学笔记

    - 使用CXF的代码第一(Code First)或契约优先(WSDL First)方式生成服务接口和服务实现。 - 在代码第一中,从Java类生成WSDL;在契约优先中,从WSDL生成Java类。 4. **依赖库** - `xalan-2.7.1.jar`:Xalan-...

    cxf-demo 比较实用的webservice例子

    1. **服务接口和实现**:通常会有一个Java接口定义服务的契约,以及一个实现类来提供服务的具体逻辑。 2. **WSDL文件**:Web服务描述语言,定义了服务的接口、消息格式和地址等信息,CXF可以根据接口自动生成WSDL。 ...

    springboot+webservice搭建webservice服务端及使用java客户端两种方式进行调用webservice接口

    接口通常以`.xsd`文件形式定义服务契约,而实现则提供具体的业务逻辑。例如,我们可以创建一个名为`GreetingService`的接口,其中包含一个`sayHello`方法: ```xml &lt;!-- greeting.xsd --&gt; ``` 接着,编写对应...

    webservice+cxf+spring

    【标题】:“WebService+CXF+Spring”是一个关于在Java环境中使用Apache CXF框架与Spring框架集成实现Web服务的专题。Apache CXF是一个开源的Web服务框架,它允许开发人员创建和部署SOAP和RESTful Web服务。Spring...

    JAVA的WebService支持-CXF

    Apache CXF是一个强大的开源框架,用于构建和消费基于SOAP和REST风格的WebService。它不仅支持JAX-WS规范,还支持JAX-RS(Java API for RESTful Web Services),这使其能够同时满足传统SOAP服务和现代RESTful服务的...

    WebService

    总结,开发和使用CXF实现的WebService涉及到服务的定义、发布、以及客户端的生成。关键步骤包括设置服务器环境、配置服务契约、实现服务逻辑,以及根据服务URL或WSDL生成客户端代码。理解并熟练掌握这些步骤对于进行...

    CXF Web Service & client

    - **契约优先或代码优先**:客户端开发可以选择契约优先(基于WSDL生成客户端代码)或代码优先(基于Java接口生成WSDL)的方式。 ### 4. RESTful服务与CXF 除了传统的SOAP服务,CXF还支持RESTful API的开发。你可以...

    webservice使用cxf的实例

    它允许开发者以编程方式或通过契约优先(合同优先)的方式创建Web服务,后者依赖于WSDL(Web服务描述语言)文件。 **3. 创建CXF Web服务** 创建CXF Web服务的第一步是定义服务接口和实现。接口定义了服务提供的操作...

    对WebService的系统研究, 七种方式实现!

    Spring-WS是基于契约优先的,这意味着服务是根据WSDL文档定义的。它提供了动态代理、AOP(面向切面编程)集成以及与其他Spring功能的无缝连接。 4. **JAX-WS**:Java API for XML Web Services (JAX-WS) 是Java平台...

Global site tag (gtag.js) - Google Analytics