http://news.misuland.com/20080926/1222396399411.html JavaSE/EE执行委员批准了JSR 311 JAX-RS作为支持RESTful web服务的java 应用程序接口。JAX-RS (Java平台上的REST支持规范 - aka JSR-311) 成为第一个到达提议为最终草案阶段的JavaEE 6的规范。查看Java规范需求点击: http://jcp.org/en/jsr/detail?id=311
http://www.blogjava.net/xmatthew/archive/2008/10/21/235777.html 与其它规范发布一样,伴随此次发布,Sun同步发布该规范的参考实现项目jersey。最新版本为1.0。 为了让大家能快速体验Rest带给我们全新的架构风格,可以直接从本地下载程序。bookstore-1.0.war 源代码 bookmark-1.0-project.zip. 下面展示了一个代码片断,让大家直观感受一下。
1 @Path("/bank")
2 public class Bank {
4 @POST
5 @Path("/account/{name}")
6 public Account createAccount(@PathParam("name") String name,
7 @QueryParam("balance")BigDecimal balance) {
8 //
9 return new Account(name, balance);
10 }
12 @GET
13 @Path("/account/{name}")
14 public Account getAccount(@PathParam("name") String name) {
15 //
16 return Account.getByName(name);
17 }
19 }
上面的代码,就会发布两个资源服务:
POST /bank/account/newAccount
GET /bank/account/newAccount
大家看到,用Rest发布资源服务非常方便。当然上面例子只是一个非常简单的示例,用于展示Rest的应用,也希望大家提出好的建议和意见。
http://www.infoq.com/cn/news/2008/10/jaxrs-comparison 比较各JAX-RS实现
正如某人在别处说的,关于公交车,有一个奇怪的现象:你等了很久一辆不来,最后却一下来了三辆!JAX-RS实现貌似也碰到了类似的问题。目前我们有:
- CXF——XFire和Celtix的合并(一个由IONA赞助的开源ESB,最初寄存在ObjectWeb上)。
- Jersey——Sun公司的JAX-RS参考实现。
- RESTEasy——JBoss的JAX-RS项目。
- Restlet——也许是最早的REST框架了,它JAX-RS之前就有了。
尽管围绕着REST存在各种各样的争论,但JAX-RS提供了Java语言所需的REST支持这一点是无可争议的。如果你是REST新手,你会选择哪种实现呢?嗯,Solomon Duskis试图解答这一问题。他还在dzone上指出:
我想就以下几个“纯”JAX-RS以外的方面对各JAX-RS实现进行比较。
这些方面包括:
- 产品成熟度
- 服务端集成策略
- Java客户端API
- 可配置能力
- 安全性
- 性能
Solomon Duskis说“Jersey的用途是作为一个参考实现。RESTEasy是新思想的游乐场。CXF是在IONA支持下的‘企业版’。Restlet项目诞生的目的是增加一种RESTful API选择。”
然而,Bill Burke在博客评论中反击道:
RESTEasy不仅仅是新思想的游乐场。其实,我们将很快在JBoss里支持它(一拿到TCK就可以),而且我们很多大客户都在催促我们提供RESTEasy支持。
在易用性方面,Solomon Duskis说:
你所面临的问题是选择一种实现。 我觉得Jersey的确很容易上手,不过Bill Burke会说RESTEasy同样很简单。它们都可以与EJB一起使用。不过,使用Jersey的话,搭建与运行测试服务很容易,如果你下载NetBeans的话更是如此。我第一次用Jersey和NetBeans时,不到半个小时就测试并运行起来了,包括下载、安装及代码浏览等。
Sun公司的人很想把Jersey与人们关于“参考实现”的传统看法区分开:
你在谈到“产品用途”时,应当将Jersey看作一种立马可投入使用的产品(事实上下个月它就要随GlassFish v3 Prelude版捆绑发布了)。Jersey团队花费了相当多的时间来测试并改善代码,以免去其作为“参考实现”的印象!:)
Solomon Duskis打算对这几个方面进行研究,然后将结果发布在博客里。一篇名为《JAX-RS Spring集成》的文章已经发布出来了。
现在的四种JAX-RS实现均提供Spring集成,连JBoss的RESTEasy都是。
接着,他对集成作了相当简短的介绍。不过正如Paul所指出的,Solomon Duskis在讲述Jersey时引用的是过时的资料。这比较遗憾,因为我们需要的是一个深入彻底的比较。Solomon Duskis最后说:
四种实现均具有相当出色的Spring/JAX-RS能力,但我认为CXF是“JAX-RS产品里Spring集成做得最好的”。
不过显然这只是他的个人看法,其他人肯定会有不同意见。比如Bill Burke就问道:
我没看出CXF在Spring集成方面比其他产品优越在哪里。我不明白 为什么所有额外的CXF专用XML都被放在一个Spring XML文档里。RESTEasy和Jersey提供的Spring集成要比CXF的侵入性更小。如果我没搞错的话。
对此,Solomon Duskis回复说:
如果各个类有一个简单的配置,能够满足超过90%的需要,那么标注驱动的方法是可行的。剩下那不到10%的部分,需要在不同场合下对同一资源作不同配置。 我知道,根据我所更新的功能的需求与当前部署,我将会需要这种方案。为了通过同样的Spring XML文档来部署具有不同配置(如不同的JDBC数据源、不同的服务实现等等)的同一个资源,CXF提供了额外的功能。基本上,大多数情况下,标注的办法是 很好的,但有时,你必须采用外部配置的办法来实现解耦(decoupling)。XML方案并不如标注一样受欢迎,但它们可以用于更复杂的配置情况。 【虎.无名:静态配置用标注,动态配置用xml或者properties文件】
或许更深入的比较能够揭示出更多的东西来?查看英文原文:A Comparison of JAX-RS Implementations
http://www.ibm.com/developerworks/cn/java/j-lo-jaxrs/index.html 使用 JAX-RS 简化 REST 应用开发
级别: 初级
殷 钢, 软件工程师, IBM
张 昊, 软件工程师, IBM
2009 年 9 月 07 日
本文将详细介绍 Java EE 6 中所引入的对 JSR-311 (JAX-RS : Java API for RESTful Web Services) 的支持,并通过一个完整的示例应用程序展示 JAX-RS 关键的设计细节以及与 JPA 的结合使用。
REST 简介
REST 是英文 Representational State Transfer 的缩写,有中文翻译为“具象状态传输”。REST 这个术语是由 Roy Fielding 在他的博士论文 《 Architectural Styles and the Design of Network-based Software Architectures 》中提出的。REST 并非标准,而是一种开发 Web 应用的架构风格,可以将其理解为一种设计模式。REST 基于 HTTP,URI,以及 XML 这些现有的广泛流行的协议和标准,伴随着 REST,HTTP 协议得到了更加正确的使用。
相较于基于 SOAP 和 WSDL 的 Web 服务,REST 模式提供了更为简洁的实现方案。目前,越来越多的 Web 服务开始采用 REST 风格设计和实现,真实世界中比较著名的 REST 服务包括:Google AJAX 搜索 API、Amazon Simple Storage Service (Amazon S3) 等。
基于 REST 的 Web 服务遵循一些基本的设计原则:
系统中的每一个对象或是资源都可以通过一个唯一的 URI 来进行寻址,URI 的结构应该简单、可预测且易于理解,比如定义目录结构式的 URI。
以遵循 RFC-2616 所定义的协议的方式显式地使用 HTTP 方法,建立创建、检索、更新和删除(CRUD:Create, Retrieve, Update and Delete)操作与 HTTP 方法之间的一对一映射:
若要在服务器上创建资源,应该使用 POST 方法;
若要检索某个资源,应该使用 GET 方法;
若要更改资源状态或对其进行更新,应该使用 PUT 方法;
若要删除某个资源,应该使用 DELETE 方法。
URI 所访问的每个资源都可以使用不同的形式加以表示(比如 XML 或者 JSON),具体的表现形式取决于访问资源的客户端,客户端与服务提供者使用一种内容协商的机制(请求头与 MIME 类型)来选择合适的数据格式,最小化彼此之间的数据耦合。
JAX-RS -- Java API for RESTful Web Services
Java EE 6 引入了对 JSR-311 的支持。JSR-311(JAX-RS:Java API for RESTful Web Services)旨在定义一个统一的规范,使得 Java 程序员可以使用一套固定的接口来开发 REST 应用,避免了依赖于第三方框架。同时,JAX-RS 使用 POJO 编程模型和基于标注的配置,并集成了 JAXB,从而可以有效缩短 REST 应用的开发周期。
JAX-RS 定义的 API 位于 javax.ws.rs 包中,其中一些主要的接口、标注和抽象类如 图 1 所示。
结束语
REST 作为一种轻量级的 Web 服务架构被越来越多的开发者所采用,JAX-RS 的发布则规范了 REST 应用开发的接口。本文首先阐述了 REST 架构的基本设计原则,然后通过一个示例应用展示了 JAX-RS 是如何通过各种标注来实现以上的设计原则的,最后还介绍了 JAX-RS 与 JPA、Gson 的结合使用。本文的示例应用使用了 Jersey 和 OpenJPA,部署在 Tomcat 容器上,替换成其它的实现只需要修改 web.xml 和 persistence.xml 配置文件。
参考资料
“编写 REST 服务”(developerWorks,2007 年 11 月):本教程讨论了 REST 和 Atom 发布协议(Atom Publishing Protocol,APP)的概念,并展示如何在服务中进行应用。
作者简介
殷钢,毕业于同济大学计算机系,获得硕士学位。目前就职于 IBM 中国开发中心 Solution Lab 部门。
-
- “构建 RESTful Web 服务”(developerWorks,2008 年 8 月):本教程从 REST 的基本概念开始,逐步指导您使用 Restlet 框架构建应用程序。
- “基于 REST 的 Web 服务:基础”(developerWorks,2008 年 12 月): 在本文中,Alex Rodriguez 将向您介绍 REST 的基本原理。
- “JSR 311”,JSR 311 的规范文档。
- “JAX-RS API”,JAX-RS 的 API 文档。
- “Jersey”,JAX-RS 的参考实现。
- “Apache CXF”,一个 Apache 软件基金会下的顶级项目,提供了 JAX-WS、JAX-RS 等的开源实现。
- “Google Gson”,一个用于将 Java 对象与 JSON 格式的数据进行双向转换的开源类库,基于 Apache License 2.0。
- “Apache OpenJPA”,一个 Apache 软件基金会下的顶级项目,提供了 JPA 规范的开源实现。
- Java 技术专区:寻找 Java 编程各方面的技术文章。