`
jianghg2010
  • 浏览: 64794 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

WebService开发笔记

阅读更多
WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过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"));
}
}
分享到:
评论

相关推荐

    OracleEBS-WebService开发笔记.pdf

    ### OracleEBS-WebService开发笔记知识点总结 #### 一、概述 **OracleEBS-WebService开发笔记** 是一份详尽的文档,旨在介绍如何利用 WebService 技术进行 Oracle E-Business Suite (EBS) 的集成开发。该文档由 ...

    SSH CXF webservice 开发笔记demo(包含步骤文档及所需war包)

    在"SSH CXF webservice 开发笔记demo.pdf"中,可能详细记录了从设置环境、创建项目、配置SSH框架、集成CXF、编写服务接口和实现、部署服务到服务器的每一步骤。"lib.rar"可能包含了项目所需的第三方库文件,包括SSH...

    WebService 开发大全

    例如,在《WebService开发笔记 3 -- 增强访问WebService的安全性》中,提到通过简单的用户口令验证机制来加强安全性。这通常涉及到WS-Security规范,可以设置消息头中的用户名令牌或数字证书,确保只有经过授权的...

    WebService

    【WebService技术详解】 WebService是一种基于互联网的、平台和语言无关的接口标准,它允许不同...学习过程中,参考"Java WebService利用(cxf)开发笔记"和"WebService开发笔记"等文档将有助于深化理解和提高实践能力。

    WebService学习笔记

    **WebService学习笔记** WebService是一种基于互联网的、平台和语言无关的接口规范,它允许不同系统间的应用程序进行交互和数据共享。这项技术的核心是利用XML(可扩展标记语言)作为数据交换格式,SOAP(简单对象...

    webService学习笔记

    在本篇WebService学习笔记中,我们将探讨几个关键的概念和技术,包括SOAP协议、JAX-WS、WSDL文档以及一些常用的Web服务框架。 首先,SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于在分布式环境...

    WebService学习笔记0001

    【WebService学习笔记0001】 在IT领域,WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的互操作性技术,它允许不同系统间的应用程序通过网络进行通信。本学习笔记将围绕WebService的核心概念、工作原理...

    分布式通信框架-webservice分析笔记1

    分布式通信框架-webservice 分析笔记 本文对分布式通信框架-webservice 进行了深入的分析和讨论,涵盖了 webservice 的定义、特点、协议层、SOAP 协议、WSDL 文件、SEI 接口等方面。 一、webservice 的定义和特点 ...

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

    使用jaxws开发webservice。 Webservice三要素 Wsdl(webservice使用说明书)重点掌握 Soap(jaxws开发webservice的传输协议)重点掌握 UDDI(了解) Webservice的使用场景分析(掌握) 学会jaxws基本开发方法...

    webservice学习笔记doc文档

    在本学习笔记中,主要介绍了使用Apache Axis2框架来开发和测试Web Service的过程。Apache Axis2是Apache SOAP栈的一个实现,提供了简单且高效的Web Service开发工具。 首先,开发者需要在Eclipse集成开发环境中搭建...

    WebService源码和笔记.zip

    4. **WebService开发工具**:如使用Apache CXF、Gson、JAXB等工具进行WebService的开发和调试。 5. **安全性考虑**:介绍如何在WebService中实现安全机制,如HTTPS加密、WS-Security(SOAP消息的安全标准)等。 6....

    CXF webservice初学笔记

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

    webservice学习笔记 -- XFrie

    【Web Service学习笔记——XFrie框架详解】 Web Service是一种通过网络进行通信的服务,它允许不同的应用程序之间进行数据交换,跨越了操作系统和编程语言的障碍。XFrie是一个轻量级、高性能的Java Web Service框架...

Global site tag (gtag.js) - Google Analytics