Apache CXF实现WebService开发(一)

Apache CXF简介

Apache CXF 是一个开源的 Services 框架,CXF 帮助您利用 Frontend 编程 API 来构建和开发 Services ,像 JAX-WS 。这些 Services 可以支持多种协议,比如:SOAP、XML/HTTP、RESTful HTTP 或者 CORBA ,并且可以在多种传输协议上运行,比如:HTTP、JMS 或者 JBI,CXF 大大简化了 Services 的创建,同时它继承了 XFire 传统,一样可以天然地和 Spring 进行无缝集成。

Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构。它允许创建高性能和可扩展的服务,您可以将这样的服务部署在 Tomcat 和基于 Spring 的轻量级容器中,以及部署在更高级的服务器上,例如 Jboss、IBM? WebSphere? 或 BEA WebLogic。

【转载使用,请注明出处:http://blog.csdn.net/mahoking

基本环境搭建

下载最新的CXF需要的jar文件,http://cxf.apache.org/download.html或者http://download.csdn.net/detail/ma_hoking/8210349。在这里我们不进行区分,将所有Apache CXF\apache-cxf-3.0.2\lib下的jar文件(不包含子目录下的文件)复制到项目下。在此我们新建一个Java Project项目CXFWebService,将前面所述的jar文件导入项目中。

创建自定义对象

注解:

@XmlRootElement-指定XML根元素名称(可选)

@XmlAccessorType-控制属性或方法序列化 , 四种方案:

  • FIELD-对每个非静态,非瞬变属性JAXB工具自动绑定成XML,除非注明XmlTransient
  • NONE-不做任何处理
  • PROPERTY-对具有set/get方法的属性进行绑定,除非注明XmlTransient
  • PUBLIC_MEMBER -对有set/get方法的属性或具有共公访问权限的属性进行绑定,除非注 明XmlTransient

@XmlType-映射一个类或一个枚举类型成一个XML Schema类型

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

/**
 * 定义对象演示
 * @author mahc
 *
 */
@XmlRootElement(name="User")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"name","loginName","age"})
public class User {

	//请使用基本属性类型
	private String name;
	private String loginName;
	private int age;

	/**
	 * ※ 需要※       无参数默认构造器
	 */
	public User() {
		super();
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getLoginName() {
		return loginName;
	}

	public void setLoginName(String loginName) {
		this.loginName = loginName;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public User(String name, String loginName, Integer age) {
		this.name = name;
		this.loginName = loginName;
		this.age = age;
	}

	@Override
	public String toString() {
		return "User [name=" + name + ", loginName=" + loginName + ", age="
				+ age + "]";
	}

}

构建WebService的接口类

import java.util.List;

import javax.jws.WebParam;
import javax.jws.WebService;

import com.mahaochen.cxf.User;

/**
 * ※@WebService:申明为webservice的注解
 *  endpointInterface:要暴露的接口类
 *  serviceName:服务名
 * @author mahc
 *
 */
@WebService(endpointInterface = "com.mahaochen.cxf.ws.IUserService", serviceName = "UserService")
public interface IUserService {

	/**
	 * ※@WebParam(name = "name"):自定义请求参数的名称
	 * @param name
	 * @param loginName
	 * @param age
	 * @return
	 */
	public User registerUser(
			@WebParam(name = "name") String name,
			@WebParam(name = "loginName") String loginName,
			@WebParam(name = "age") int age);

	public List<User> getRegistedUsers();

}

注意事项:

如果

@WebService(endpointInterface = "com.mahaochen.cxf.ws.IUserService", serviceName = "UserService")

填写错误会报错:Could not load Webservice SEI。

构建WebService的实现类

import java.util.ArrayList;
import java.util.List;

import com.mahaochen.cxf.User;

public class UserService implements IUserService{

	private static List<User> userList = new ArrayList<User>();

	@Override
	public User registerUser(String name, String loginName, int age) {

		User user = new User(name, loginName, age);
		userList.add(user);
		return user;
	}

	@Override
	public List<User> getRegistedUsers() {

		for(int i=0;i<2;i++){
			User tempUser = new User("name"+i, "loginName"+i, 18+i);
			userList.add(tempUser);
		}
		return userList;
	}

}

发布WebService服务

/**
 * 发布WebServie服务测试类
 * @author mahc
 *
 */
public class TestCXFWebService {

	public static void main(String[] args) {
		System.out.println("CXFWebService is starting!");
		IUserService userService = new UserService();
		String address = "http://localhost:8090/CXFWebService";
//		String testAddress = "http://localhost:8090/CXFWebService?wsdl";
		Endpoint.publish(address, userService);
		System.out.println("CXFWebService is started!");
	}
}

测试WebService

通过IE浏览器,访问http://localhost:8090/CXFWebService?wsdl

<?xml version='1.0' encoding='UTF-8'?><wsdl:definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://ws.cxf.mahaochen.com/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" name="UserServiceService" targetNamespace="http://ws.cxf.mahaochen.com/">
  <wsdl:types>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ws.cxf.mahaochen.com/" elementFormDefault="unqualified" targetNamespace="http://ws.cxf.mahaochen.com/" version="1.0">
  <xs:element name="User" type="tns:user"/>
  <xs:element name="getRegistedUsers" type="tns:getRegistedUsers"/>
  <xs:element name="getRegistedUsersResponse" type="tns:getRegistedUsersResponse"/>
  <xs:element name="registerUser" type="tns:registerUser"/>
  <xs:element name="registerUserResponse" type="tns:registerUserResponse"/>

  <xs:complexType name="registerUser">
    <xs:sequence>
      <xs:element minOccurs="0" name="name" type="xs:string"/>
      <xs:element minOccurs="0" name="loginName" type="xs:string"/>
      <xs:element name="age" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="registerUserResponse">
    <xs:sequence>
      <xs:element minOccurs="0" name="return" type="tns:user"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="user">
    <xs:sequence>
      <xs:element minOccurs="0" name="name" type="xs:string"/>
      <xs:element minOccurs="0" name="loginName" type="xs:string"/>
      <xs:element name="age" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="getRegistedUsers">
    <xs:sequence/>
  </xs:complexType>

  <xs:complexType name="getRegistedUsersResponse">
    <xs:sequence>
      <xs:element maxOccurs="unbounded" minOccurs="0" name="return" type="tns:user"/>
    </xs:sequence>
  </xs:complexType>

</xs:schema>
  </wsdl:types>
  <wsdl:message name="registerUserResponse">
    <wsdl:part element="tns:registerUserResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="getRegistedUsers">
    <wsdl:part element="tns:getRegistedUsers" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="registerUser">
    <wsdl:part element="tns:registerUser" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:message name="getRegistedUsersResponse">
    <wsdl:part element="tns:getRegistedUsersResponse" name="parameters">
    </wsdl:part>
  </wsdl:message>
  <wsdl:portType name="IUserService">
    <wsdl:operation name="registerUser">
      <wsdl:input message="tns:registerUser" name="registerUser">
    </wsdl:input>
      <wsdl:output message="tns:registerUserResponse" name="registerUserResponse">
    </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getRegistedUsers">
      <wsdl:input message="tns:getRegistedUsers" name="getRegistedUsers">
    </wsdl:input>
      <wsdl:output message="tns:getRegistedUsersResponse" name="getRegistedUsersResponse">
    </wsdl:output>
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="UserServiceServiceSoapBinding" type="tns:IUserService">
    <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="registerUser">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="registerUser">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="registerUserResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="getRegistedUsers">
      <soap:operation soapAction="" style="document"/>
      <wsdl:input name="getRegistedUsers">
        <soap:body use="literal"/>
      </wsdl:input>
      <wsdl:output name="getRegistedUsersResponse">
        <soap:body use="literal"/>
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="UserServiceService">
    <wsdl:port binding="tns:UserServiceServiceSoapBinding" name="UserServicePort">
      <soap:address location="http://localhost:8090/CXFWebService"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

测试WebService访问的Client类

import java.util.List;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import com.mahaochen.cxf.User;

public class Client {

	public static void main(String[] args) {

		 JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
	     factoryBean.setServiceClass(IUserService.class);
	     factoryBean.setAddress("http://localhost:8090/CXFWebService");
	     IUserService userService  = (IUserService) factoryBean.create();
	     User user = userService.registerUser("name", "loginName", 28);
	     user.toString();
	     List<User> users = userService.getRegistedUsers();
	     System.out.println(user.toString());
	}
}

以上是单独部署的方式之一,然而很多情况下,我们并不希望我们的WebService和我们的应用分开成两个服务器,而希望他们在同一个容器,Tomcat或JBOSS或其他的,这样我们就必须通过WEB来部署我们前面完成的webservice。这部分将在下篇博文中介绍,敬请期待!

【转载使用,请注明出处:http://blog.csdn.net/mahoking

时间: 2024-11-05 16:10:30

Apache CXF实现WebService开发(一)的相关文章

Apache CXF实现WebService开发(二)

本文我们将承接上文Apache CXF实现WebService开发(一) http://blog.csdn.net/mahoking/article/details/41631993.完成将我们开发的WebService与我们的Web项目部署到同一个容器内例如Tomcat或JBOSS或其他的.本例我们使用的CXF的版本为apache-cxf-2.6.16.所使用是的相关jar包(文件)和文件所在的路径为: /CXFWebServer/WebRoot/WEB-INF/lib/commons-log

Apache CXF实现WebService入门教程(附完整源码)

Apache CXF实现WebService非常简单实用,只需要几步就可以实现一个简单的web service. 首先我们需要新建一个maven项目,在pom中添加依赖和jetty作为测试的web service的web容器. 如下是测试用到的pom文件内容: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance&qu

基于Spring和CXF的webservice开发环境搭建

使用CXF发布webservice服务时,规范的做法是先书写一个接口,用以声明服务类型. 基于Spring和CXF开发web service的框架搭建 一.创建web项目 Eclipse中新建一个dynamic webproject,命名为:CXFTest 二.导入需要的jar包 把下载的CXF项目的解压缩文件中lib文件夹下的所有jar包拷贝到WebContent->WEB-INF->lib文件夹下 三.创建服务接口 在Java resource->src目录下新建package包:c

Web应用使用Apache CXF 建立 WebService——详细案例(与Spring结合)

转载请注明出处:http://blog.csdn.net/u013474104/article/details/45097957 步骤- - 1.使用Maven依赖jar文件 2.web.xml配置 a.加载cxf-beans.xml配置文件 b.配置CXF Servlect 3.cxf-beans.xml服务配置 a.lics2uldwms.java服务接口类 b.lics2uldwms.java服务接口的实现类 4.访问服务接口 5.Client调用服务接口--TestDemo.java类

Apache CXF实现WebService发布和调用

第一种方法:不用导入cxf jars 服务端: 1. 新建Web工程 2.新建接口和实现类.测试类 目录结构图如下: 接口代码: package com.cxf.spring.service; import javax.jws.WebMethod; import javax.jws.WebService; @WebService public interface IGreetingService { @WebMethod public String greeting(String name);

Spring的WebService开发

由于项目使用Spring开发,所以笔者选择了Apache CXF进行WebService开发,原因是Apache CXF 提供方便的Spring整合方法,可以通过注解.Spring标签式配置来暴露Web Services和消费Web Services. 1.     首先去http://cxf.apache.org/download.html 下载最新的版本(目前是2.4.1) 2.     导入相应的包到项目中,大概包如下:               commons-logging-1.1.

cxf+spring+数字签名开发webservice

数字证书的准备         下面做的服务端和客户端证书在例子中无法加解密,不知道什么原因,我是使用正式环境中的客户端和服务端进行开发测试的,所以需要大家自己去准备证书,或者有人知道为什么jdk生成的一对证书无法加解密的原因那在好不过了.下面是我用jdk生成的证书: 1.1.客户端 1.创建私钥和keystore                     keytool -genkey -alias clientprivatekey -keypass keypass -keystore clie

Apache CXF+Spring开发环境搭建小试

最近手上一个项目要开发webservice,而原有系统使用了spring,所以在选择框架的时候,我选择了cxf,这样在开发整合的时候就比较方便了.在搭建开发环境的过程中发现这篇文章写得比较详细,所以就搬到自己博客里,希望给自己和同行做参考. CXF 应用开发 下面就将开始我们的 CXF Web Services 的开发之旅!首先,要有一个基于 Eclipse 的开发环境:然后,我们将利用这个开发环境开发一个简单的“调查投票”示例,同时我们将解释一些 CXF 在开发中进行配置的基本方法. 开发环境

使用Apache CXF开发WebServices服务端、客户端

在前一篇的博客中,我使用Xfire1.x来开发了WebServies的服务端. 但是如果你访问Apache的官网,可以看到xfire已经被合并了. 最新的框架叫做CXF. Apache CXF = Celtix + XFire. CXF 继承了 Celtix 和 XFire 两大开源项目的精华, 提供了对 JAX-WS 全面的支持,并且提供了多种 Binding .DataBinding.Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code Fi