zt 比較各JAX-RS實現:CXF,Jersey,RESTEasy,Restlet

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=311html

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. 下面展現了一個代碼片段,讓你們直觀感覺一下。java

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的應用,也但願你們提出好的建議和意見。web

http://www.infoq.com/cn/news/2008/10/jaxrs-comparison 比較各JAX-RS實現spring

正如某人在別處說的,關於公交車,有一個奇怪的現象:你等了好久一輛不來,最後卻一下來了三輛!JAX-RS實現貌似也碰到了相似的問題。目前咱們有:apache

  • CXF——XFireCeltix的合併(一個由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 編程各方面的技術文章。
相關文章
相關標籤/搜索