JAX-RS入门 二 :运行

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

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

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

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

Java代码  

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. import javax.ws.rs.core.Application;
  4. public class CustomerApplication extends Application {
  5. private Set<Object> singletons = new HashSet<Object>();
  6. private Set<Class<?>> empty = new HashSet<Class<?>>();
  7. public CustomerApplication() {
  8. singletons.add(new CustomerResourceService());
  9. }
  10. @Override
  11. public Set<Class<?>> getClasses() {
  12. return empty;
  13. }
  14. @Override
  15. public Set<Object> getSingletons() {
  16. return singletons;
  17. }
  18. }

简单说明:

  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:

Java代码  

  1. <servlet>
  2. <servlet-name>rest</servlet-name>
  3. <servlet-class><strong>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</strong></servlet-class>
  4. <init-param>
  5. <param-name><strong>javax.ws.rs.Application</strong></param-name>
  6. <param-value><strong>com.restfully.shop.services.CustomerApplication</strong></param-value>
  7. </init-param>
  8. </servlet>
  9. <servlet-mapping>
  10. <servlet-name>rest</servlet-name>
  11. <url-pattern>/*</url-pattern>
  12. </servlet-mapping>

最后的web.xml文件内容如下:

Java代码  

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  5. id="WebApp_ID" version="2.5">
  6. <display-name>JaxrsService</display-name>
  7. <welcome-file-list>
  8. <welcome-file>index.html</welcome-file>
  9. <welcome-file>index.htm</welcome-file>
  10. <welcome-file>index.jsp</welcome-file>
  11. <welcome-file>default.html</welcome-file>
  12. <welcome-file>default.htm</welcome-file>
  13. <welcome-file>default.jsp</welcome-file>
  14. </welcome-file-list>
  15. <display-name>Archetype Created Web Application</display-name>
  16. <servlet>
  17. <servlet-name>rest</servlet-name>
  18. <servlet-class>org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet</servlet-class>
  19. <init-param>
  20. <param-name>javax.ws.rs.Application</param-name>
  21. <param-value>com.restfully.shop.services.CustomerApplication</param-value>
  22. </init-param>
  23. </servlet>
  24. <servlet-mapping>
  25. <servlet-name>rest</servlet-name>
  26. <url-pattern>/*</url-pattern>
  27. </servlet-mapping>
  28. </web-app>

这个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的实现,如下:

Java代码  

  1. JAXRSServerFactoryBean bean = ResourceUtils.createApplication(
  2. new CustomerApplication(), false);
  3. String address = "http://localhost:8008/";
  4. bean.setAddress(address);
  5. Server server = bean.create();
  6. server.start();
  7. try {
  8. Thread.sleep(100000000);
  9. } catch (InterruptedException e) {
  10. e.printStackTrace();
  11. }
  12. server.stop();

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

剩下的测试过程同上。

时间: 2024-11-05 06:27:08

JAX-RS入门 二 :运行的相关文章

[WebGL入门]二十,绘制立体模型(圆环体)

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. 本次的demo的运行结果 立体的模型 这次稍微喘口气,开始绘制立体模型.这里说的[喘口气]是指本次的文章中没有出现任何新的技术知识点.只是利用到现在为止所介绍过的内容,来绘制一个立体的圆环体.到现在为止,只绘制了三角形和四边形,当然,在三维空间中绘制简单的多边形也没什么不对,但是缺点儿说服力.

kafka入门二:Kafka的设计思想、理念

本节主要从整体角度介绍Kafka的设计思想,其中的每个理念都可以深入研究,以后我可能会发专题文章做深入介绍,在这里只做较概括的描述以便大家更好的理解Kafka的独特之处.本节主要涉及到如下主要内容: Kafka设计基本思想 Kafka中的数据压缩 Kafka消息转运过程中的可靠性 Kafka集群镜像复制 Kafka 备份机制 一.kafka由来 由于对JMS日常管理的过度开支和传统JMS可扩展性方面的局限,LinkedIn(www.linkedin.com)开发了Kafka以满足他们对实时数据流

DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表

原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的,为了帮助更多的人不会像我这样浪费时间才写的这篇文章,高手不想的看请路过 本文内容来DevExpress XtraReports帮助文档,如看过类似的请略过. 废话少说 开始正事 一.创建应用程序并添加报表 启动 MS Visual Studio (2005.2008.或 2010). 在 Visua

MongooooooooooooooooooooDB入门二:基本概念介绍

前言 工欲善其事必先利其器.在学习MongoDB之前,需要对MongoDB的一些基本概念有系统的了解. 所以,本篇文章主要介绍MongoDB的一些基本概念,这些概念的定义均来自<MongoDB权威指南>,关于此书想要了解更多,请点击此处. 我尽量使用最简洁的语言来尽可能完整地描述这些基本概念,如有遗漏或不妥之处欢迎指正. 文档 文档是MongoDB的核心概念之一.多个键值对有序地放在一起便是文档.例如: {"name":"Jerry","sco

Flex入门(二)——Flex+BlazeDs+J2ee小实例

首先来简单介绍一下BlazeDS. BlaseDS的核心功能包括RPC Services(远程过程调用服务) 和Messaging Service(消息服务).BlazeDS是一个基于服务器的Java远程调用(remoting)和web消息传递(messaging)技术,使得后台的Java应用程序可以和运行在浏览器上的Flex应用程序能够互相通信.简单来说一个BlazeDS应用包括客户端(Flex或AIR应用程序)和一个服务端(J2EE程序).BlazeDS在期间起着承上启下的作用,Flex和B

[WebGL入门]二,开始WebGL之前,先了解一下canvas

注:文章译自http://wgld.org/,原作者杉本雅広(doxas),文章中如果有我的额外说明,我会加上[lufy:],另外,鄙人webgl研究还不够深入,一些专业词语,如果翻译有误,欢迎大家指正. HTML5和canvas标签 现在(2012年2月)HTML5依然处于草案阶段. HTML5支持网页端的多媒体功能和画布功能,追加了很多全新的更合理的Tag标签,各个浏览器也都在逐渐的完善这些新的特性. Canvas对象表示一个 HTML画布元素,如它的名字一样,它定义了一个API支持脚本化客

Python入门(二)——IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化

Python入门(二)--IDE选择PyCharm,输入和输出,基础规范,数据类型和变量,常量,字符串和编码,格式化 我们从今天就开始正式的学习PY交易了,PY交易还行,我们有基础之后学习起来倒不是说那么的被动,我学习的是Python2.7,虽然现在随着版本的迁移至Python3,但是这个并不会对我们造成什么困扰,毕竟只是一个适应阶段 我们的学习资料:廖雪峰官方网站Python2.7教程 一.IDE选择PyCharm 我们虽然在前面一章已经配置过,但是我们还是有很多的IDE可以开发Py,比如su

mybatis入门(二)

mybatis入门(二) 探究sql语句的映射过程 要探究sql执行过程,先看一个简单的小例子 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <map

redis入门(二)

目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单介绍了redis的历史和安装部署,以及基本的数据结构和api,本节讲解redis持久化.高可用.redis集群和分布式相关的知识. 持久化 redis作为内存数据库,数据全部存储到内存中.但是若出现断电等原因会造成数据丢失.redis内置了2种持久化的方式,分别为RDB持久化和AOF持久化. RDB

Docker入门二:容器管理

Docker入门二:容器管理 LinuxDocker time: 2019-12-3 容器管理 docker常用命令 注: 命令中的CONTAINER,可以是conainer_id,也可以是container name docker system info # 查看docker系统信息 docker container ls -a 查看当前已经创建的container docker container ls: -a 显示所有容器 -q 仅显示ID -s 显示container的文件大小 快速启动