文档章节

JAX-RS入门 二 :运行

Yohance
 Yohance
发布于 2015/07/13 22:43
字数 789
阅读 113
收藏 0

上一节,已经成功的定义了一个REST服务,并且提供了具体的实现,不过我们还需要把它运行起来。

 

在上一节的装备部分,列举了必须的jar(在tomcat中运行)和可选的jar(作为一个独立的应用程序运行)。这一节将分别介绍如何做为一个独立的应用程序运行和如何在tomcat里运行。

 

Tomcat(或者其他Web容器)中运行

要在tomcat之类的容器里运行,首先需要定义一个Application类:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.core.Application;

public class CustomerApplication extends Application {
	private Set<Object> singletons = new HashSet<Object>();
	private Set<Class<?>> empty = new HashSet<Class<?>>();

	public CustomerApplication() {
		singletons.add(new CustomerResourceService());
	}

	@Override
	public Set<Class<?>> getClasses() {
		return empty;
	}

	@Override
	public Set<Object> getSingletons() {
		return singletons;
	}
}

简单说明:

  1. getClasses():返回所有定义的服务类的类;每次请求都生成新的服务对象
  2. getSingletons():返回所有定义的服务类的实例;每次请求都会重用已经存在对象

因为我们的数据需要被重用,因为getClasses()返回空;getSingletons()返回创建的一个对象实现。

 

有了这个application类后,就需要一个特定的servlet类去处理具体的调用,其中application类做为这个servlet类的一个init-param参数指定。

 

不同的JAX-RS的实现者会有不同的对应的servlet的实现,这里我选择的Apache CXF的实现,它对应的servlet类为:

org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet

 

所以我们需要在web.xml中如下样声明一个servlet:

<servlet>
		<servlet-name>rest</servlet-name>
		<servlet-class><strong>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</strong></servlet-class>
		<init-param>
			<param-name><strong>javax.ws.rs.Application</strong></param-name>
			<param-value><strong>com.restfully.shop.services.CustomerApplication</strong></param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>rest</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>

这个REST服务已经实现完成,接下来就可以运行了,在工程上点右键: Run As -> Run on server

如果没有配server,这里需要配一个web server,配置完成后,工程就会自动在这个server上运行。最后就可以测试了,这里推荐用SoapUI测试。

 

假设选定是tomcat,tomcat的上下文路径是http://localhost:8080/,并且假设工程名是 JaxrsDemo,那么这个REST服务的根路径就是: http://localhost:8080/JaxrsDemo/customers ;它会对应提供一个wadl文件,路径为:http://localhost:8080/JaxrsDemo/customers/?_wadl 。

 

直接导入 http://localhost:8080/JaxrsDemo/customers/?_wadl  到SoapUI中,对应的请求方法和结构就会自动生成,只需要填入测试内容即可。

 

独立的应用程序

与web容器有几点不同之处:

  1. 需要提供自己的上下文路径,即上面的http://localhost:8080/JaxrsDemo部分
  2. 需要自己控制启动和停止

如果看看org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet的源码就会发现,其中的关键类是:org.apache.cxf.jaxrs.JAXRSServerFactoryBean。

我们需要得到一个org.apache.cxf.jaxrs.JAXRSServerFactoryBean对象,然后通过它来得到一个org.apache.cxf.endpoint.Server对象,这个org.apache.cxf.endpoint.Server对象就可以理解成是一个tomcat。

 

参考org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet的实现,如下:

JAXRSServerFactoryBean bean = ResourceUtils.createApplication(
				new CustomerApplication(), false);
		String address = "http://localhost:8008/";
		bean.setAddress(address);
		Server server = bean.create();
		server.start();
		try {
			Thread.sleep(100000000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		server.stop();

其中 http://localhost:8008/ 就相当于http://localhost:8080/JaxrsDemo部分,所以这个REST服务的路径为:http://localhost:8008/customers , 对应的服务定义文件为: http://localhost:8008/customers/?_wadl .

 

剩下的测试过程同上。





本文转载自:http://blog.csdn.net/u011700318/article/details/38558115

共有 人打赏支持
Yohance
粉丝 14
博文 82
码字总数 44971
作品 0
浦东
程序员
私信 提问
基于SOA 思想下的WebService实战资料分享

跟大家分享基于SOA 思想下的WebService实战(电子商务需求,分析,架构全涉及,百万数据优化) 课程讲解内容涵盖: 第1章 CXF框架快速起步(2课时) Webservice技术规则 Java-WebService技术规范...

abcfhl
2013/06/24
1K
7
WebService基础入门 CXF(WS + RS)

一、基本介绍 Web Services是一个软件接口,它描述了一组可以在网络上通过标准化的 XML 消息传递访问的操作。它使用基于 XML 语言的协议来描述要执行的操作或者要与另一个 Web 服务交换的数据...

Leon丶l
2017/11/04
0
0
【2016-05-08】Jersey vs. SpringMVC

当前Web Service 常用的风格有两种,RESTful风格和RPC风格。 一、RESTful与RPC简介 RPC的中心是方法,REST的中心是资源。 RPC:其中RPC风格中常见的有XML-RPC和JSON-RPC,JSON以其简洁、传输...

rathan0
2016/05/08
1K
0
为 Android 开发访问 JAX-RS Web 服务的 Apache HttpClient 客户端

简介: 使用 Apache HttpClient 库访问 JAX-RS web 服务。Jersey 是 JAX-RS 的参考实现,它简化了 Java™ 环境下的 RESTful Web 服务的开发。Android 是一款流行的智能手机,本文将展示如何为...

IBMdW
2011/11/07
2.3K
3
REST 导学:在 Jetty 中运行 Spring 和 JAX-RS(Apache CXF)

对于底层服务端Java开发人员来说,与外借沟通的唯一方法就是通过API。今天的文章都是关于JAX-RS的:使用Java来编写和发布RESTful服务。 但我们不会用那些涉及到应用服务器,WAR包和其他说不清...

jackyrong
2013/03/24
4.8K
0

没有更多内容

加载失败,请刷新页面

加载更多

如何开发一款以太坊(安卓)钱包系列2 - 导入账号及账号管理

这是如何开发一款以太坊(安卓)钱包系列第2篇,如何导入账号。有时用户可能已经有一个账号,这篇文章接来介绍下,如何实现导入用户已经存在的账号。 导入账号预备知识 从用户需求上来讲,导...

Tiny熊
今天
2
0
intellJ IDEA搭建java+selenium自动化环境(maven,selenium,testng)

1.安装jdk1.8; 2.安装intellJ; 3.安装maven; 3.1 如果是单前用户,配置用户环境变量即可,如果是多用户,则需配置系统环境变量,变量名为MAVEN_HOME,赋值D:\Application\maven,往path中...

不最醉不龟归
今天
3
0
聊聊ShenandoahGC的Brooks Pointers

序 本文主要研究一下ShenandoahGC的Brooks Pointers Shenandoah Shenandoah面向low-pause-time的垃圾收集器,它的GC cycle主要有 Snapshot-at-the-beginning concurrent mark包括Init Mark(P......

go4it
昨天
2
0
Makefile通用编写规则

#简单实用的Makefile模板: objs := a.o b.o test:$(objs) gcc -o test $^ # .a.o.d .b.o.d dep_files := $(foreach f,$(objs),.$(f).d) dep_files := $(wildcard $(dep_files)) ifneq ($(d......

shzwork
昨天
2
0
《万历十五年》的读后感作文4000字

《万历十五年》的读后感作文4000字: 万历十五年,即1587年,距今已过去432年。在明朝276的历史中,这一年很平淡,并没有什么特别之处。黄仁宇的《万历十五年》一书,有别于其他的历史叙述方...

原创小博客
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部