`

WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单

    博客分类:
  • Java
阅读更多

    现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过WebService进行信息数据的操作。下面就将我们在开发中摸索的一点经验教训总结以下,以供大家参考.

WebService开发笔记 2 -- VS 2005 访问WebServcie更简单中作一个跨平台访问WebServcie服务的例子....

WebService开发笔记 3 -- 增强访问 WebService 的安全性通过一个简单的用户口令验证机制来加强一下WebService的安全性....

我们项目的整个架构使用的比较流行的WSH MVC组合,即webwork2 + Spring + Hibernate;
1.首先集成Apacha CXF WebService 到 Spring 框架中;
   apache cxf 下载地址:http://people.apache.org/dist/incubator/cxf/2.0.4-incubator/apache-cxf-2.0.4-incubator.zip
  在spring context配置文件中引入以下cxf配置

	<import resource="classpath*:META-INF/cxf/cxf.xml" />
	<import resource="classpath*:META-INF/cxf/cxf-extension-soap.xml" />
	<import resource="classpath*:META-INF/cxf/cxf-servlet.xml" />


   在web.xml中添加过滤器:

	<servlet>
		<servlet-name>CXFServlet</servlet-name>
		<servlet-class>
			org.apache.cxf.transport.servlet.CXFServlet
		</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>CXFServlet</servlet-name>
		<url-pattern>/services/*</url-pattern>
	</servlet-mapping>



2.开发服务端WebService接口:

/**
 * WebService接口定义类.
 * 
 * 使用@WebService将接口中的所有方法输出为Web Service.
 * 可用annotation对设置方法、参数和返回值在WSDL中的定义.
 */
@WebService
public interface WebServiceSample {


	/**
	 * 一个简单的方法,返回一个字符串
	 * @param hello
	 * @return
	 */
	String say(String hello);
	
	/**
	 * 稍微复杂一些的方法,传递一个对象给服务端处理
	 * @param user
	 * @return
	 */
	String sayUserName(
			@WebParam(name = "user") 
			UserDTO user);
	
	/**
	 * 最复杂的方法,返回一个List封装的对象集合
	 * @return
	 */
	public 
	@WebResult(partName="o")
	ListObject findUsers();

}


由简单到复杂定义了三个接口,模拟业务需求;

3.实现接口

/**
 * WebService实现类.
 * 
 * 使用@WebService指向Interface定义类即可.
 */
@WebService(endpointInterface = "cn.org.coral.biz.examples.webservice.WebServiceSample")
public class WebServiceSampleImpl implements WebServiceSample {

	public String sayUserName(UserDTO user) {
		return "hello "+user.getName();
	}

	public String say(String hello) {
		return "hello "+hello;
	}

	public ListObject findUsers() {
		ArrayList<Object> list = new ArrayList<Object>();
		
		list.add(instancUser(1,"lib"));
		list.add(instancUser(2,"mld"));
		list.add(instancUser(3,"lq"));
		list.add(instancUser(4,"gj"));
		ListObject o = new ListObject();
		o.setList(list);
		return o;
	}
	
	private UserDTO instancUser(Integer id,String name){
		UserDTO user = new UserDTO();
		user.setId(id);
		user.setName(name);
		return user;
	}
}



4.依赖的两个类:用户对象与List对象

/**
 * Web Service传输User信息的DTO.
 * 
 * 分离entity类与web service接口间的耦合,隔绝entity类的修改对接口的影响.
 * 使用JAXB 2.0的annotation标注JAVA-XML映射,尽量使用默认约定.
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "User")
public class UserDTO {

	protected Integer id;

	protected String name;

	public Integer getId() {
		return id;
	}

	public void setId(Integer value) {
		id = value;
	}

	public String getName() {
		return name;
	}

	public void setName(String value) {
		name = value;
	}
}


关于List对象,参照了有关JWS的一个问题中的描述:DK6.0 自带的WebService中 WebMethod的参数好像不能是ArrayList 或者其他List
传递List需要将List 包装在其他对象内部才行 (个人理解 如有不对请指出) ,我在实践中也遇到了此类问题.通过以下封装的对象即可以传递List对象.

/**
 * <p>Java class for listObject complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * <complexType name="listObject">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="list" type="{http://www.w3.org/2001/XMLSchema}anyType" maxOccurs="unbounded" minOccurs="0"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "listObject", propOrder = { "list" })
public class ListObject {

	@XmlElement(nillable = true)
	protected List<Object> list;

	/**
	 * Gets the value of the list property.
	 * 
	 * <p>
	 * This accessor method returns a reference to the live list,
	 * not a snapshot. Therefore any modification you make to the
	 * returned list will be present inside the JAXB object.
	 * This is why there is not a <CODE>set</CODE> method for the list property.
	 * 
	 * <p>
	 * For example, to add a new item, do as follows:
	 * <pre>
	 *    getList().add(newItem);
	 * </pre>
	 * 
	 * 
	 * <p>
	 * Objects of the following type(s) are allowed in the list
	 * {@link Object }
	 * 
	 * 
	 */
	public List<Object> getList() {
		if (list == null) {
			list = new ArrayList<Object>();
		}
		return this.list;
	}

	public void setList(ArrayList<Object> list) {
		this.list = list;
	}

}



5.WebService 服务端 spring 配置文件 ws-context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">
	
	<jaxws:endpoint id="webServiceSample"
		address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl"/>

</beans>



WebService 客户端 spring 配置文件 wsclient-context.xml

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:jaxws="http://cxf.apache.org/jaxws"
	xsi:schemaLocation="http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">

	<!-- ws client -->
	<bean id="identityValidateServiceClient" class="cn.org.coral.admin.service.IdentityValidateService"
		factory-bean="identityValidateServiceClientFactory" factory-method="create" />

	<bean id="identityValidateServiceClientFactory"
		class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass"
			value="cn.org.coral.admin.service.IdentityValidateService" />
		<property name="address"
			value="http://88.148.29.54:8080/coral/services/IdentityValidateService"/>
	</bean>
	
</beans>


6.发布到tomcat服务器以后通过以下地址即可查看自定义的webservice接口生成的wsdl:
http://88.148.29.54:8080/aio/services/WebServiceSample?wsdl

7.调用WebService接口的Junit单元测试程序

package test.coral.sample;

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;

import cn.org.coral.biz.examples.webservice.WebServiceSample;
import cn.org.coral.biz.examples.webservice.dto.UserDTO;

public class TestWebServiceSample extends
		AbstractDependencyInjectionSpringContextTests {
	WebServiceSample webServiceSampleClient;

	public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
		this.webServiceSampleClient = webServiceSampleClient;
	}
	
	@Override
	protected String[] getConfigLocations() {
		setAutowireMode(AUTOWIRE_BY_NAME);
                  //spring 客户端配置文件保存位置
		return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
	}
	
	public void testWSClinet(){
		Assert.hasText(webServiceSampleClient.say(" world"));
	}
}

分享到:
评论

相关推荐

    WebService CXF --- 传输文件MTOM

    WebService CXF,全称Apache CXF,是一款开源的Java框架,用于构建和开发Web服务。它支持多种协议和规范,包括SOAP、RESTful、XML以及Web服务标准如WS-*。在"WebService CXF --- 传输文件MTOM"这个主题中,我们将...

    apache-cxf-2.2.6.zip webservice cxf开发利器完整开发包

    4. **JAX-RS支持**:CXF也支持Java API for RESTful Web Services (JAX-RS),使开发RESTful Web服务变得简单。通过使用注解,开发者可以直接将Java方法映射到HTTP请求,实现资源导向的编程模型。 5. **数据绑定**:...

    webservice-cxf-spring-jar.zip

    【标题】"webservice-cxf-spring-jar.zip" 是一个包含了使用Apache CXF与Spring框架集成开发Web服务的Java库集合。这个压缩包提供了一整套必要的JAR文件,以便于开发者在他们的项目中快速搭建和运行基于CXF的Web服务...

    cxf的jar包.rar

    利用Apache CXF开发webservice接口需要用到的jar集合 cxf-core-3.0.15.jar cxf-rt-bindings-soap-3.0.15.jar cxf-rt-bindings-xml-3.0.15.jar cxf-rt-databinding-jaxb-3.0.15.jar cxf-rt-frontend-jaxws-3.0.15.jar...

    webservice-cxf-2.3.5

    Apache CXF 是一个开源的 Web 服务框架,用于构建和部署 SOAP 和 RESTful Web 服务。版本 2.3.5 是该框架的一个历史版本,它在当时提供了丰富的特性和功能,帮助开发者创建高效、灵活的网络应用。下面将详细阐述 ...

    基于CXF的webService本地数据交互----PC端与Android端(二)

    在本篇博文中,我们将深入探讨如何利用Apache CXF实现Web Service进行本地数据交互,特别是在PC端和Android端之间的通信。Apache CXF是一个开源框架,它允许开发人员创建和消费各种Web服务,包括SOAP和RESTful风格的...

    WebService CXF --- 由WSDL文件开发Client端

    WebService CXF是一个强大的开源框架,用于创建和消费Web服务。它允许开发者基于WSDL(Web Service Description Language)文件快速地生成服务端和客户端代码,极大地简化了Web服务的开发流程。在本篇中,我们将深入...

    基于CXF的webService本地数据交互----PC端与Android端(一)

    - 利用CXF的WS-Security插件进行安全性测试,确保通信过程中数据的完整性和保密性。 - 使用CXF的WSDL工具生成客户端代码,或者通过Postman等工具模拟请求,进行功能测试和性能测试。 5. **注意事项**: - 考虑到...

    webservice apache-cxf-3.0.7 jar包

    Apache CXF 是一个开源的Java框架,主要用于构建和开发Web服务。这个项目源自XFire,并在2007年合并到Apache基金会,更名为CXF。CXF允许开发者以SOAP、RESTful、XML/HTTP、WS-*协议等多种方式来实现Web服务。在本...

    apache-cxf2.7.18官方版最稳定版本

    2. **RESTful服务**:CXF也支持JAX-RS规范,使得开发RESTful Web服务变得简单。通过注解,开发者可以轻松地将普通的Java方法转换为HTTP操作。 3. **多种协议支持**:除了HTTP,CXF还支持其他传输协议,如JMS、XMPP...

    apache-cxf-2.7.18.rar

    cxf自动生成webservice客户端,apache-cxf-2.7.18最稳定的版本 apache cxf 框架wsdl2java命令的使用。 -encoding是指定编码类型; -p 指定包名 -d 指定生成目录 -all生成服务端和客户端代码 -...

    CXF实现简单的WebService接口开发

    本篇文章将深入探讨如何利用CXF来实现一个简单的WebService接口开发。 首先,我们要了解什么是CXF。CXF全称CXF Commons eXtensible Services Framework,它不仅支持SOAP(Simple Object Access Protocol)协议,还...

    Webservice-CXF实用手册学习大全

    - Apache CXF是一个开源服务框架,由ObjectWeb Celtix和Codehaus XFire合并而成,提供了一种简单的方式来构建和开发WebService。 - CXF的核心组件是Bus,它类似于Spring的ApplicationContext,用于管理WebService...

    基于CXF实现WebService开发.pdf

    在具体技术实现上,CXF使用了Spring框架,从而使得WebService的开发能够利用Spring的依赖注入、声明式事务等特性,增强了应用的可维护性和扩展性。 总结来说,Apache CXF是一个功能强大的WebService开发框架,它...

    CXF(Webservice)开发手册

    CXF Webservice 开发手册

    CXF webservice初学笔记

    【CXF Webservice初学笔记】 在IT行业中,Web服务是一种允许不同系统之间进行通信和交换数据的方法。Apache CXF是一个流行的开源框架,用于构建和部署Web服务。本笔记将探讨CXF Webservice的基础知识,包括其核心...

    纯java调用ws-security+CXF实现的webservice安全接口

    1. **配置CXF客户端**:首先,你需要创建一个CXF客户端实例,通过`JaxWsProxyFactoryBean`来设置服务地址和服务接口。同时,你可以配置ws-security的相关参数,如用户名、密码、加密算法等。 2. **创建安全上下文**...

    Java+WebService利用(cxf)开发笔记.rar

    这篇"Java+WebService利用(cxf)开发笔记"是一个宝贵的资源,尤其适合初学者理解和掌握CXF框架。 1. **Java WebService概述**:Java WebService是基于标准的、平台无关的方式来实现服务导向架构(SOA)。它通过WSDL...

    apache-cxf-3.1.6所有jar包

    Apache CXF 是一个开源的Java框架,主要用于构建和开发服务导向架构(SOA)和Web服务。这个"apache-cxf-3.1.6所有jar包"的压缩文件包含了CXF 3.1.6版本的所有核心库和依赖组件。在Java Web服务开发中,CXF扮演着重要...

    Webservice笔记含使用cxf和jaxws两种方式开发webservice【源代码+笔记】

    第一天: 什么是webservice? 从案例(便民查询网站)分析如何实现?...CXF开发webservice: CXF入门程序 Spring+cxf整合(重点) CXF发布rest的webservice。(重点) 综合案例: 实现便民查询网站

Global site tag (gtag.js) - Google Analytics