8 個(gè)最好的 Java RESTful 框架
過(guò)去的每一年,涌現(xiàn)出越來(lái)越多的Java框架。就像JavaScript,每個(gè)人都認(rèn)為他們知道一個(gè)好的框架的功能應(yīng)該是怎么樣的。連我的老祖母現(xiàn) 在也使用 一個(gè)我從來(lái)沒(méi)有聽(tīng)說(shuō)過(guò)而且可能永遠(yuǎn)不會(huì)使用的框架。玩笑歸玩笑,可以做幾乎任何事的臃腫的框架市場(chǎng)已經(jīng)飽和,,但是如何評(píng)判呢?這篇文章旨在提供目前*** 的 Java RESTfulful 框架。我只介紹輕量級(jí)的產(chǎn)品, 略過(guò)了那些臃腫的過(guò)度設(shè)計(jì)的框架。同時(shí),我只想要他們穩(wěn)定和成熟,提供簡(jiǎn)單,輕量級(jí)的特點(diǎn)。我只在介紹Play frameworks時(shí)打破這條規(guī)則,理由稍后給出。在將來(lái)的項(xiàng)目中使用哪個(gè) Java RESTful框架完全取決于你當(dāng)前的需求。為了便于你取舍,我將列出最突出的框架功能,希望這能節(jié)省一些你的時(shí)間。
Dropwizard
誕生時(shí)間: 2011
評(píng)分: 4.5/5
Dropwizard 提供了穩(wěn)定成熟的Java庫(kù), 并封裝成一個(gè)簡(jiǎn)單的輕量級(jí)的包。
Dropwizard 介于框架和庫(kù)之間。它提供了一個(gè)開發(fā)web應(yīng)用程序的全部所需。由于內(nèi)置模塊化,一個(gè)應(yīng)用程序可以保持小而精干的特點(diǎn),減少開發(fā)和維護(hù)的時(shí)間,減少負(fù)擔(dān)。
Dropwizard 使用已有的 Jetty HTTP 庫(kù),嵌入到你的項(xiàng)目中,無(wú)需外部的server。所有的Dropwizard項(xiàng)目都有一個(gè) main 方法來(lái)管理內(nèi)建的 HTTP server.
鏈接
優(yōu)點(diǎn)
-
快速的項(xiàng)目構(gòu)建和啟動(dòng)
-
模塊化
-
不可思議的快(至少根據(jù)內(nèi)建的 metric 測(cè)得的結(jié)果)
-
Jetty for HTTP, Jersey for REST, 以及 Jackson for JSON
-
也支持其它的庫(kù), 比如 Mustache, Logback, JDBI, Hibernate Validator, Guava, …
-
使用Metrics支持監(jiān)控
-
Main方法啟動(dòng) Jetty server,可以容易地調(diào)試和維護(hù)
-
社區(qū)力度強(qiáng)
缺點(diǎn)
-
Dropwizard文檔是主要的知識(shí)來(lái)源,但談不上優(yōu)秀。你可能需要搜索和發(fā)掘第三方類庫(kù)的文檔。
-
因?yàn)槟承┰蝈e(cuò)誤被當(dāng)作普通文本, 如果你希望響應(yīng)結(jié)果總是JSON,這可能有問(wèn)題
-
確保使用***的Dropwizard, 一些老版本使用了廢棄的第三方庫(kù)。 而且早期的Dropwizzard也很難升級(jí)
例子
package com.example.helloworld;
import io.dropwizard.Application;
import io.dropwizard.setup.Bootstrap;
import io.dropwizard.setup.Environment;
import com.example.helloworld.resources.HelloWorldResource;
import com.example.helloworld.health.TemplateHealthCheck;
public class HelloWorldApplication extends Application<HelloWorldConfiguration> {
public static void main(String[] args) throws Exception {
new HelloWorldApplication().run(args);
}
@Override
public String getName() {
return "hello-world";
}
@Override
public void initialize(Bootstrap<HelloWorldConfiguration> bootstrap) {
// nothing to do yet
}
@Override
public void run(HelloWorldConfiguration configuration,
Environment environment) {
// nothing to do yet
}
}
注解
個(gè)人不想為大的項(xiàng)目推薦這個(gè)框架。不過(guò)如果你想嘗試的話,你不會(huì)失望的。主要是這個(gè)框架使用***的現(xiàn)代的Java web 組件,組裝成一個(gè)簡(jiǎn)單易用的框架。
不幸的是這也帶來(lái)了它的問(wèn)題。 將這些庫(kù)糅合起來(lái)可能導(dǎo)致不可預(yù)見(jiàn)的問(wèn)題。這也是我為什么給它減掉0.5顆星,而沒(méi)有評(píng)為滿分5顆星。
Jersey
誕生時(shí)間: 2012 (Jersey 2.X)
評(píng)分: 5/5
Jersey RESTful 框架是開源的RESTful框架, 實(shí)現(xiàn)了JAX-RS (JSR 311 & JSR 339) 規(guī)范。它擴(kuò)展了JAX-RS 參考實(shí)現(xiàn), 提供了更多的特性和工具, 可以進(jìn)一步地簡(jiǎn)化 RESTful service 和 client 開發(fā)。盡管相對(duì)年輕,它已經(jīng)是一個(gè)產(chǎn)品級(jí)的 RESTful service 和 client 框架。
鏈接
優(yōu)點(diǎn)
-
優(yōu)秀的文檔和例子
-
快速
-
超級(jí)容易的路由
-
平滑的 JUnit 集成
-
就個(gè)人而言, 當(dāng)開發(fā) RESTful service 時(shí), JAX-RS 實(shí)現(xiàn)要好于 MVC 框架。
-
可以集成到其它庫(kù)/框架 (Grizzly, Netty). 這也可能是很多產(chǎn)品使用它的原因。
-
支持異步鏈接
-
不喜歡 servlet container? 使用Jersey的時(shí)候可以不用它們。
-
WADL, XML/JSON support
-
包含在Glassfish中
缺點(diǎn)
-
Jersey 2.0+使用了有些復(fù)雜的依賴注入實(shí)現(xiàn)
-
可能不是一件壞事。Jersey 1.X 使用較老的 JAX-RS 實(shí)現(xiàn)
-
一大堆第三方庫(kù)只支持 Jersey 1.X, 在 Jersey 2.X 不可用
例子
package org.glassfish.jersey.examples.helloworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("helloworld")
public class HelloWorldResource {
public static final String CLICHED_MESSAGE = "Hello World!";
@GET
@Produces("text/plain")
public String getHello() {
return CLICHED_MESSAGE;
}
}
注解
Jersey 是我的選擇, 5顆星。
Ninja Web Framework
誕生時(shí)間: 2012
評(píng)分: 3.5/5
Ninja Web Framework是全棧的 java web framework。穩(wěn)定, 快速, 可靠, 產(chǎn)品級(jí).
它提供了開發(fā),測(cè)試,發(fā)布,維護(hù) RESTful web應(yīng)用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.).
就像 DropWizzard, Ninja Web Framework 是一個(gè)集成的軟件棧。你不必建立你自己的,只需使用 Maven archetype生成一個(gè)新的項(xiàng)目,導(dǎo)入到IDE中就可以開始編碼了。
鏈接
優(yōu)點(diǎn)
-
快
-
快速的項(xiàng)目構(gòu)建和啟動(dòng)
-
模塊化
-
XML, HTML, JSON渲染
-
也支持其它的庫(kù) (如 Guice, Logback, Guava, etc.)
-
很好的數(shù)據(jù)持久化和緩存
-
不喜歡 servlet container? U可以選擇你喜歡的容器
-
如果根本就不喜歡容器,可以使用 standalone 模式, 使用Jetty作為一個(gè)自執(zhí)行的jar
缺點(diǎn)
-
同樣,就像DropWizzard, 文檔有但是不夠好。我花了好長(zhǎng)時(shí)間去了解它。這個(gè)框架也依賴很多其它的庫(kù),有時(shí)候想得到所需的信息很麻煩。
-
不怎么出名,社區(qū)小。 有謠言說(shuō)這個(gè)框架是由那些切換到Scala的 Play 2.X 用戶創(chuàng)建的
例子
package controllers;
public class ApplicationController {
public Result index() {
Person person = new Person();
person.name = "John Johnson";
return Results.json().render(person);
}
}
注解
看起來(lái)不錯(cuò),但是在它成熟之前我還是把它丟在一邊吧。
Play Framework
誕生時(shí)間: 2011
評(píng)分: 4/5
使用Play Framework 很容易地創(chuàng)建,構(gòu)建和發(fā)布 web 應(yīng)用程序,支持 Java & Scala。它使用Akka, 基于一個(gè)輕量級(jí)的無(wú)狀態(tài)的架構(gòu)。它應(yīng)該應(yīng)用于大規(guī)模地低CPU和內(nèi)存消耗的應(yīng)用。
鏈接
優(yōu)點(diǎn)
-
易于開發(fā)
-
快,但是沒(méi)有其它的一些框架快
-
基于 Netty, 支持非阻塞的 I/O. 并行處理遠(yuǎn)程調(diào)用的時(shí)候很優(yōu)秀
-
社區(qū)很大
-
快速的項(xiàng)目構(gòu)建和啟動(dòng)
-
模塊化
-
MVC
-
REST, JSON/XML, Web Sockets, non-blocking I/O
-
只需刷新瀏覽器就可以看到***的改變
-
支持Async
-
有出版的書
缺點(diǎn)
-
版本2.0 是最有爭(zhēng)議的Java框架。 切換至Switch to Scala made some Java developers outraged.
-
不向后兼容; Play 2.X 重寫了
-
號(hào)稱輕量級(jí),但有些臃腫
-
SBT構(gòu)建工具. 號(hào)稱 Maven 殺手, 但是從沒(méi)有優(yōu)秀到替換它。難以學(xué)習(xí)和配置
-
非 servlet
-
Breaking changes across releases
例子
package controllers
import play.api._
import play.api.mvc._
class Application extends Controller {
def hello(name: String) = Action {
Ok("Hello " + name + "!")
}
}
注解
抱怨歸抱怨,我還是一直喜歡和***這個(gè)框架。不幸的是,我只能給它4顆星。我堅(jiān)信 基于JAX-RS的框架更適合 RESTful web services.
RestExpress
誕生時(shí)間: 2009
評(píng)分: 3/5
RestExpress是一個(gè)非容器的輕量級(jí)的 Netty HTTP棧的包裝, 以便更容易地創(chuàng)建 Java RESTful services.
RestExpress 目標(biāo)是支持***的 RESTful 實(shí)踐。
鏈接
優(yōu)點(diǎn)
-
真正的微框架
-
***的性能,快,可靠
-
XML/JSON
-
最老的也是最穩(wěn)定的 RESTful 框架之一
缺點(diǎn)
-
沒(méi)有文檔
-
幾乎沒(méi)有支持
-
很小的社區(qū)
例子
package com.example;
import java.io.IOException;
import io.netty.handler.codec.http.HttpMethod;
import org.restexpress.RestExpress;
public class Main
{
public static RestExpress startServer(String[] args) throws IOException
{
RestExpress server = new RestExpress();
MyResource r = new MyResource();
server.uri("/myapp/myresource", r)
.method(HttpMethod.GET)
.noSerialization();
server.uri("/myapp/myresource", r)
.method(HttpMethod.POST);
server.bind(8080);
return server;
}
public static void main(String[] args) throws Exception
{
RestExpress server = startServer(args);
System.out.println("Hit enter to stop it...");
System.in.read();
server.shutdown();
}
}
注解
盡管這個(gè)框架超級(jí)快,我也不想推薦它。文檔缺乏以及沒(méi)有支持使它成為一個(gè)欠佳的框架。看在速度的份上給它3顆星。
Restlet
誕生時(shí)間: 2005
評(píng)分: 4.5/5
Restlet 幫助Java程序員建立大規(guī)模的快速的符合 RESTful 架構(gòu)模式的web api。
它提供了強(qiáng)大的路由和 filtering 系統(tǒng)。統(tǒng)一的client/server Java API. 滿足所有主要的平臺(tái) (Java SE/EE, Google AppEngine, OSGi, GWT, Android) 以及提供了無(wú)數(shù)的擴(kuò)展以滿足程序員的需求。
據(jù)我說(shuō)知,它是***個(gè) java RESTful web 框架。很多公司都在用它,但是你可能從未聽(tīng)說(shuō)過(guò)它,好像它已經(jīng)不可見(jiàn)了。
鏈接
優(yōu)點(diǎn)
-
強(qiáng)大
-
企業(yè)級(jí)的框架
-
多平臺(tái) Java SE, Java EE, Google Web Toolkit, Google AppEngine, Android, OSGi environments
-
支持JAX-RS (就像 Jersey)
-
大部分高級(jí) RESTful 支持
-
模塊化
-
支持其它庫(kù)
-
開發(fā)一直活躍
-
智能的url綁定, 全功能的 URI 路由
-
有相關(guān)的書籍
缺點(diǎn)
-
非常陡峭的學(xué)習(xí)曲線
-
關(guān)閉的社區(qū),盡管 StackOverflow 上還是開放的
-
不再流行,更多的是因?yàn)?Play Framework 和 Jersey
例子
public class Part03 extends ServerResource {
public static void main(String[] args) throws Exception {
// Create the HTTP server and listen on port 8182
new Server(Protocol.HTTP, 8182, Part03.class).start();
}
@Get("txt")
public String toString() {
return "hello, world";
}
}
注解
盡管這個(gè)框架還一直流行,考慮到它的年紀(jì)和當(dāng)前的完成度,我不能給它5顆星。
Restx
誕生時(shí)間: 2013
評(píng)分: 3.5/5
Restx 是一個(gè)輕量級(jí)的,模塊化的,特性眾多的,超快的開源 Java REST 框架。
鏈接
優(yōu)點(diǎn)
-
快速,輕量級(jí)
-
容易搭建
-
真正的微框架
-
模塊化
-
支持其它庫(kù)
-
支持MongoDB
缺點(diǎn)
-
不友好的令人迷惑的文檔。對(duì)于這類框架我期望能有好一點(diǎn)的文檔
-
太年輕
-
目前還不支持異步Async
例子
@GET("/message/{id}")
public Message sayHello(String id, // path param
String who // query param
) {
return new Message().setMessage(String.format(
"hello %s, it's %s",
who, DateTime.now().toString("HH:mm:ss")));
}
@POST("/message/{id}")
public Message sayHello(String id, // path param
Message msg // body param
) {
return msg.setMessage(String.format(
"%s @ %s",
msg.getMessage(), DateTime.now().toString("HH:mm:ss")));
}
注解
真心來(lái)講我沒(méi)有在這個(gè)框架上花費(fèi)太多時(shí)間。不值得在另一個(gè)框架上花費(fèi)太多精力,我意思是說(shuō),Java框架市場(chǎng)已經(jīng)越來(lái)越碎片化了,就像 JavaScript 市場(chǎng),應(yīng)該停止這種趨勢(shì)了。
Spark Framework
誕生時(shí)間: 2011
評(píng)分: 3.5/5
不要和 Apache 的大數(shù)據(jù)框架 Spark 弄混, 這里的 Spark 框架是一個(gè)輕量級(jí)的 Java web 框架,用來(lái)進(jìn)行快速的開發(fā)(50% Spark用戶使用 Spark 創(chuàng)建 REST APIs)。 它受 Ruby 框架 Sinatra 啟發(fā)。
它有一個(gè)不到1M的最小化的內(nèi)核, 提供了所有基本的特性, 用來(lái)構(gòu)建 RESTful 或者傳統(tǒng)的 web 應(yīng)用程序。
鏈接
優(yōu)點(diǎn)
-
快,輕量級(jí)
-
優(yōu)秀的快速原型
-
易于搭建
-
經(jīng)常和AngularJS搭配使用
-
真正的微框架
-
使用 Jetty
-
可以用在容器中或者獨(dú)立運(yùn)行
缺點(diǎn)
-
文檔可以更好,它不適合初學(xué)者
-
不適合大型項(xiàng)目
-
社區(qū)小
例子
import static spark.Spark.*;
public class HelloWorld {
public static void main(String[] args) {
get("/hello", (req, res) -> "Hello World");
}
}
注解
這個(gè)框架適合初始開發(fā)。主要用作小小項(xiàng)目或者原型。


























