`
eksliang
  • 浏览: 598866 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

CXF学习笔记三(发布restFul)

阅读更多

转载请出自出处:http://eksliang.iteye.com/blog/2266666

一、概述

JAX-RS是Java提供用于开发RESTful Web服务基于注解(annotation)的API。JAX-RS旨在定义一个统一的规范,使得Java程序员可以使用一套固定的接口来开发REST应用,避免了依赖第三方框架。同时JAX-RS使用POJO编程模型和基于注解的配置并集成JAXB,可以有效缩短REST应用的开发周期。JAX-RS只定义RESTful API,具体实现由第三方提供,如Jersey、Apache CXF等。

 

JAX-RS包含近五十多个接口、注解和抽象类:

javax.ws.rs包含用于创建RESTful服务资源的高层次(High-level)接口和注解。

javax.ws.rs.core包含用于创建RESTful服务资源的低层次(Low-level)接口和注解。

javax.ws.rs.ext包含用于扩展JAX-RS API支持类型的APIs。

 

JAX-RS常用注解:

@Path:标注资源类或方法的相对路径。

@GET、@PUT、@POST、@DELETE:标注方法的HTTP请求类型。

@Produces:标注返回的MIME媒体类型。

@Consumes:标注可接受请求的MIME媒体类型。

@PathParam、@QueryParam、@HeaderParam、@CookieParam、@MatrixParam、@FormParam:标注方法的参数来自于HTTP请求的位置。@PathParam来自于URL的路径,@QueryParam来自于URL的查询参数,@HeaderParam来自于HTTP请求的头信息,@CookieParam来自于HTTP请求的Cookie。

 

二、依赖JAR文件Maven坐标

<properties>
		<cxf.version>3.0.7</cxf.version>
		<junit.version>4.11</junit.version>
	</properties>
<!-- CXF需要导入的jar包 -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxws</artifactId>
			<version>${cxf.version}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<!-- CXF实现RestFul接口需要用到的包 -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-frontend-jaxrs</artifactId>
			<version>${cxf.version}</version>
		</dependency>
		<!-- 客户端调用restFul服务需要导入的包 -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-rs-client</artifactId>
			<version>${cxf.version}</version>
		</dependency>

		<!-- 部署至tomcat低下不会,jetty环境需要加入该包 -->
		<dependency>
			<groupId>org.apache.cxf</groupId>
			<artifactId>cxf-rt-transports-http-jetty</artifactId>
			<version>${cxf.version}</version>
		</dependency>

 

 

三、发布RestFul接口

3.1实体对象

/**
 * @author Ickes
 */
@XmlRootElement(name="UserInfo")
public class Users{
	private String userId;
	private String userName;
	private String userPwd;
	private Integer sex;
	private Float sal;
	private Date birthday;
       
        get、set方法省略!
       
	public String toJson() {
		Gson gson = new Gson();
		return gson.toJson(this);
	}
}

 

3.2、定义发布接口

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

/**
 * 用户服务接口
 * @author Ickes
 */
@Path("/restFul")
public interface UserService {
	/**
	 * 测试GET方法,传人对象、普通参数;返回对象
	 * 
	 */
	@GET
	@Path("/get")
	@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
	public Users get(@QueryParam("id") String id);
	
	
	/**
	 * 测试PUT方法,传人对象、普通参数;返回对象
	 * id来源于url后面的参数
	 * @param user
	 * @return
	 */
	@PUT
	@Path("/put/{id}")
	@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
	public Users put(@PathParam("id")String id,Users u);
	
	
	/**
	 * 测试POST方法,传人对象、普通参数;返回对象
	 * 
	 */
	@POST
	@Path("/post/{id}")
	@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
	public Users post(@PathParam("id") String id,Users u);
	
	
	/**
	 * 测试DELETE方法 ,传人普通参数;返回对象
	 */
	@DELETE
	@Path("/delete/{id}")
	@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})
	public Users delete(@PathParam("id") String id);
	
}

 

3.3、接口实现类

import java.util.Date;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;

/**
 * 用户服务实现类
 * 
 * @author Ickes
 */
public class UserServiceRestFul implements UserService {

	@Override
	public Users get(String id) {
		System.out.println("GET方法,id=" + id);
		Users user = new Users();
		user.setUserId("get");
		user.setUserName("ickes");
		user.setUserPwd("ices123");
		user.setSex(1);
		user.setSal(32F);
		user.setBirthday(new Date());
		return user;
	}

	@Override
	public Users put(String id, Users u) {
		System.out.println("PUT方法,id=" + id + ",users=" + u.toJson());
		Users user = new Users();
		user.setUserId("put");
		user.setUserName("ickes");
		user.setUserPwd("ices123");
		user.setSex(1);
		user.setSal(32F);
		user.setBirthday(new Date());
		return user;
	}

	@Override
	public Users post(String id, Users u) {
		System.out.println("POST方法,id=" + id + ",users=" + u.toJson());
		Users user = new Users();
		user.setUserId("post");
		user.setUserName("ickes");
		user.setUserPwd("ices123");
		user.setSex(1);
		user.setSal(32F);
		user.setBirthday(new Date());
		return user;
	}

	@Override
	public Users delete(String id) {
		System.out.println("DELETE方法,id=" + id);
		Users user = new Users();
		user.setUserId("delete");
		user.setUserName("ickes");
		user.setUserPwd("ices123");
		user.setSex(1);
		user.setSal(32F);
		user.setBirthday(new Date());
		return user;
	}
}

 

四、发布RestFul接口

4.1、使用CXF的API接口进行发布

使用CXF的API接口进行发布的缺点很明显,就是必须指定一个端口进行发布,这个端口不能被占用,占用就会抛出异常。

	/**
	 * 使用CXF发布RestFul服务
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		JAXRSServerFactoryBean jrf = new JAXRSServerFactoryBean();
		jrf.setResourceClasses(UserServiceRestFul.class);
		jrf.setResourceProvider(UserServiceRestFul.class,
				new SingletonResourceProvider(new UserServiceRestFul()));
		jrf.setAddress("http://localhost:8080/rest/");
		jrf.create();
	}

 

4.2、在spring容器中进行发布

跟使用CXF发布JAX-WS接口一样,首先必须在web.xml中配置CXFWebServlet,代码如下:

<!-- Cxf中使用 CXFServlet,发布跟当前项目端口相同的服务 -->
	<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>/cxf/*</url-pattern>
	</servlet-mapping>

 然后在类路径下面新建applicationContext-cxf.xml,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:jaxrs="http://cxf.apache.org/jaxrs"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
	http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd 
	http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd ">

	<jaxrs:server id="restUserService" address="/restFul">
		<jaxrs:serviceBeans>
			<ref bean="userServiceRestFul" />
		</jaxrs:serviceBeans>
		<jaxrs:extensionMappings>
			<entry key="json" value="application/json" />
			<entry key="xml" value="application/xml" />
		</jaxrs:extensionMappings>
	</jaxrs:server>
	<bean id="userServiceRestFul" class="com.gosun.jws.cxf.restful.UserServiceRestFul"></bean>
</beans>

 

发布后在浏览器中输入http://localhost:8080/jws/cxf,出现如下见面说明发布成功.



 

 

五、客户端调用

5.1、使用WebClient进行调用(不推荐)

使用org.apache.cxf.jaxrs.client.WebClient调用的代码如下:

import javax.ws.rs.core.MediaType;
import org.apache.cxf.jaxrs.client.WebClient;
import org.junit.Before;
import org.junit.Test;

/**
 * @author Ickes
 */

public class WebClientTest {

	WebClient client = null;

	@Before
	public void init() {
		client = WebClient.create("http://localhost:8080/rest/");
	}

	/**
	 * 调用get方法,get方式是将参数加入到URL地址后面的,所以不能传人Bean,但是可以转换为json的格式进行传递
	 * 
	 * @param client
	 */
	@Test
	public void getTest() {
		// 测试URL传递数据
		client = WebClient
				.create("http://localhost:8080/rest/restFul/get?id=ickes");
		Users u = client.accept(MediaType.APPLICATION_XML).get(Users.class);
		System.out.println(u.toJson());
	}

	/**
	 * 调用put方法,可以看到这种方式可以传人一个JavaBean参数, 但是集合对象不行,可以将集合写在JavaBean里面进行传递
	 */
	@Test
	public void putTest() {
		Users u = new Users();
		u.setUserId("1");
		u.setUserName("aa");
		u.setUserPwd("bbb");
		client.path("restFul/put/{id}", "ickes")
				.accept(MediaType.APPLICATION_XML).put(u);
	}

	/**
	 * 调用post方法,这种方式的调用跟put方式异曲同工
	 * 
	 */
	@Test
	public void postTest() {
		Users u = new Users();
		u.setUserId("1");
		u.setUserName("aa");
		u.setUserPwd("bbb");
		client.accept(MediaType.APPLICATION_XML)
				.path("/restFul/post/{id}", "post").post(u);
	}

	/**
	 * 调用Delete方法,这个方法可以看到delete方法是不能传递参数的,只能通过其他方式,例如URL
	 * 
	 */
	@Test
	public void deleteTest() {
		client.accept(MediaType.APPLICATION_XML)
				.path("/restFul/delete/{id}", "post").delete();
	}
}

 

5.2、使用CXF的客户端工厂类JAXRSClientFactory进行调用(推荐)

这种方式相对比WebClient要更简单,直接使用接口中的方法即可,代码如下:

import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.junit.Before;
import org.junit.Test;

/**
 * <pre>
 * 调用RestFul接口,除了使用WebClient意外,还可以使用org.apache.cxf.jaxrs.client.JAXRSClientFactory;
 * 这种方式相对比WebClient要更简单,直接使用接口中的方法即可
 * </pre>
 * 
 * @author Ickes
 */
public class JAXRSClientFactoryTest {
	UserService us = null;

	@Before
	public void init() {
		us = JAXRSClientFactory.create("http://localhost:8080/jws/cxf/restFul",UserService.class);
		System.out.println(us);
	}

	/**
	 * 调用get方法
	 */
	@Test
	public void getTest() {
		System.out.println(us.get("a").toJson());
	}

	/**
	 * 调用put方法
	 */
	@Test
	public void putTest() {
		Users u = new Users();
		u.setUserId("1");
		u.setUserName("aa");
		u.setUserPwd("bbb");
		System.out.println(us.post("a001",u));
	}
	
	/**
	 * 调用post方法
	 * 
	 */
	@Test
	public void postTest() {
		Users u = new Users();
		u.setUserId("1");
		u.setUserName("aa");
		u.setUserPwd("bbb");
		us.post("POST", u);
	}
	
	/**
	 * 调用Delete方法
	 * 
	 */
	@Test
	public void deleteTest() {
		us.delete("DELETE");
	}
	
}

 

如果想在Spring配置文件中配置org.apache.cxf.jaxrs.client.JAXRSClientFactory,代码如下:

<bean id="userService" class="org.apache.cxf.jaxrs.client.JAXRSClientFactory" factory-method="create">
		<constructor-arg type="java.lang.String" value="http://localhost:8080/rest/" />
		<constructor-arg type="java.lang.Class" value="com.gosun.jws.cxf.restful.UserService" />
	</bean>

 

 

 

 

 

 

  • 大小: 24.5 KB
分享到:
评论

相关推荐

    WebService的实现——CXF学习笔记

    【WebService的实现——CXF学习笔记】 在Java世界中,WebService是一种通过标准协议(如SOAP)进行跨平台、跨语言通信的技术。CXF是Apache软件基金会的一个开源项目,它提供了构建和消费Web服务的工具和库。CXF支持...

    CXF学习笔记.docx )

    - 功能特性:CXF提供了丰富的功能,包括SOAP、RESTful服务的支持,支持多种协议如HTTP、JMS等,以及XML数据绑定、WS-Security等Web服务安全标准。 - CXF 概述:CXF起源于两个开源项目Axiom和XFire的合并,旨在为...

    Apache cxf 学习笔记.pdf

    Apache CXF 是一个开源的Java框架,它主要用于构建和开发服务导向架构(Service-Oriented Architecture, SOA)的应用程序。...通过深入学习和实践,开发者可以充分利用CXF的优势,提高软件开发的效率和质量。

    Apache_cxf_学习笔记

    本学习笔记旨在提供对Apache CXF的基本理解、功能特性和实际操作指导。 **1. CXF 简介** 1.1 CXF概述 Apache CXF是一个全面的服务开发框架,它允许开发者创建和部署各种类型的Web服务,包括基于SOAP、RESTful、WS-...

    Axis2,CXF版本学习笔记

    文件“WebService_CXF学习.doc”和“axis2_WebService_开发指南.docx”、“axis_WebService_-_开发指南.docx”应该包含了关于这两个框架的详细教程和实践案例,可以帮助你更深入地理解和应用它们。 总的来说,Axis2...

    cxf学习笔记之结合spring创建客户端

    **CXF** 是一个强大的Web服务框架,它支持SOAP、RESTful等多种服务样式,并提供了丰富的功能,如WSDL第一和第二类生成、WS-Security、MTOM等。CXF使得开发和部署Web服务变得更加简单。 **Spring** 是一个企业级Java...

    webservice+cxf基础笔记和视频,

    总的来说,这份“webservice+cxf基础笔记和视频”资源将引导你进入Web服务的世界,通过学习和实践,你可以掌握使用CXF和Spring进行Web服务开发的基本技能。无论你是初学者还是有一定经验的开发者,这都将是一份有...

    Apache-cxf-学习笔记.docx

    Apache CXF是一个强大的开源Web服务框架,源自Celtix和XFire两个项目的合并,现在作为Apache软件基金会的顶级项目存在。...无论是新手还是经验丰富的开发者,都可以通过CXF的学习和实践,提升Web服务开发的效率和质量。

    CXF 学习小例子

    压缩包中的"学习笔记.docx"可能包含了作者对CXF学习过程的详细记录,包括但不限于CXF的核心概念、配置文件解析、服务发布与调用步骤、异常处理机制、以及与其他技术(如servlet)的集成等内容。这些笔记通常会以实例...

    CXF webservice初学笔记

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

    CXF笔记

    【CXF笔记】是关于Apache CXF框架的深入学习记录,该笔记可能涵盖了CXF的基本概念、使用方法、源码解析以及与开发工具的结合应用。Apache CXF是一个开源服务框架,它允许开发者构建和部署多种Web服务。通过CXF,我们...

Global site tag (gtag.js) - Google Analytics