654
技術社區[雲棲]
較好的8個 Java RESTful 框架
過去的每一年,湧現出越來越多的Java框架。就像JavaScript,每個人都認為他們知道一個好的框架的功能應該是怎麼樣的。在將來的項目中使用哪個 Java RESTful框架完全取決於你當前的需求。為了便於你取舍,我將列出最突出的框架功能,希望這能節省一些你的時間。
DROPWIZARD
誕生時間: 2011
評分: 4.5/5
Dropwizard 提供了穩定成熟的Java庫, 並封裝成一個簡單的輕量級的包。
Dropwizard 介於框架和庫之間。它提供了一個開發web應用程序的全部所需。由於內置模塊化,一個應用程序可以保持小而精幹的特點,減少開發和維護的時間,減少負擔。
Dropwizard 使用已有的 Jetty HTTP 庫,嵌入到你的項目中,無需外部的server。所有的Dropwizard項目都有一個 main 方法來管理內建的 HTTP server.
優點
-
快速的項目構建和啟動
-
模塊化
-
不可思議的快(至少根據內建的 metric 測得的結果)
-
Jetty for HTTP, Jersey for REST, 以及 Jackson for JSON
-
也支持其它的庫, 比如 Mustache, Logback, JDBI, Hibernate Validator, Guava, …
-
使用Metrics支持監控
-
Main方法啟動 Jetty server,可以容易地調試和維護
-
社區力度強
缺點
-
Dropwizard文檔是主要的知識來源,但談不上優秀。你可能需要搜索和發掘第三方類庫的文檔。
-
因為某些原因錯誤被當作普通文本, 如果你希望響應結果總是JSON,這可能有問題
-
確保使用最新的Dropwizard, 一些老版本使用了廢棄的第三方庫。 而且早期的Dropwizzard也很難升級
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
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 {
public static void main(String[] args) throws Exception {
new HelloWorldApplication().run(args);
}
@Override
public String getName() {
return "hello-world" ;
}
@Override
public void initialize(Bootstrap bootstrap) {
// nothing to do yet
}
@Override
public void run(HelloWorldConfiguration configuration,
Environment environment) {
// nothing to do yet
}
} |
注解
個人不想為大的項目推薦這個框架。不過如果你想嚐試的話,你不會失望的。主要是這個框架使用最好的現代的Java web 組件,組裝成一個簡單易用的框架。
不幸的是這也帶來了它的問題。 將這些庫糅合起來可能導致不可預見的問題。這也是我為什麼給它減掉0.5顆星,而沒有評為滿分5顆星。
JERSEY
誕生時間: 2012 (Jersey 2.X)
評分: 5/5
Jersey RESTful 框架是開源的RESTful框架, 實現了JAX-RS (JSR 311 & JSR 339) 規範。它擴展了JAX-RS 參考實現, 提供了更多的特性和工具, 可以進一步地簡化 RESTful service 和 client 開發。盡管相對年輕,它已經是一個產品級的 RESTful service 和 client 框架。
優點
-
優秀的文檔和例子
-
快速
-
超級容易的路由
-
平滑的 JUnit 集成
-
就個人而言, 當開發 RESTful service 時, JAX-RS 實現要好於 MVC 框架。
-
可以集成到其它庫/框架 (Grizzly, Netty). 這也可能是很多產品使用它的原因。
-
支持異步鏈接
-
不喜歡 servlet container? 使用Jersey的時候可以不用它們。
-
WADL, XML/JSON support
-
包含在Glassfish中
缺點
-
Jersey 2.0+使用了有些複雜的依賴注入實現
-
可能不是一件壞事。Jersey 1.X 使用較老的 JAX-RS 實現
-
一大堆第三方庫隻支持 Jersey 1.X, 在 Jersey 2.X 不可用
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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
誕生時間: 2012
評分: 3.5/5
Ninja Web Framework是全棧的 java web framework。穩定, 快速, 可靠, 產品級.
它提供了開發,測試,發布,維護 RESTful web應用的一切(Servlets, Guice, JPA, Flyway migrations, Maven, etc.).
就像 DropWizzard, Ninja Web Framework 是一個集成的軟件棧。你不必建立你自己的,隻需使用 Maven archetype生成一個新的項目,導入到IDE中就可以開始編碼了。
優點
-
快
-
快速的項目構建和啟動
-
模塊化
-
XML, HTML, JSON渲染
-
也支持其它的庫 (如 Guice, Logback, Guava, etc.)
-
很好的數據持久化和緩存
-
不喜歡 servlet container? U可以選擇你喜歡的容器
-
如果根本就不喜歡容器,可以使用 standalone 模式, 使用Jetty作為一個自執行的jar
缺點
-
同樣,就像DropWizzard, 文檔有但是不夠好。我花了好長時間去了解它。這個框架也依賴很多其它的庫,有時候想得到所需的信息很麻煩。
-
不怎麼出名,社區小。 有謠言說這個框架是由那些切換到Scala的 Play 2.X 用戶創建的
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package controllers;
public class ApplicationController {
public Result index() {
Person person = new Person();
person.name = "John Johnson" ;
return Results.json().render(person);
}
} |
注解
看起來不錯,但是在它成熟之前我還是把它丟在一邊吧。
PLAY FRAMEWORK
誕生時間: 2011
評分: 4/5
使用Play Framework 很容易地創建,構建和發布 web 應用程序,支持 Java & Scala。它使用Akka, 基於一個輕量級的無狀態的架構。它應該應用於大規模地低CPU和內存消耗的應用。
優點
-
易於開發
-
快,但是沒有其它的一些框架快
-
基於 Netty, 支持非阻塞的 I/O. 並行處理遠程調用的時候很優秀
-
社區很大
-
快速的項目構建和啟動
-
模塊化
-
MVC
-
REST, JSON/XML, Web Sockets, non-blocking I/O
-
隻需刷新瀏覽器就可以看到最新的改變
-
支持Async
-
有出版的書
缺點
-
版本2.0 是最有爭議的Java框架。 切換至Switch to Scala made some Java developers outraged.
-
不向後兼容; Play 2.X 重寫了
-
號稱輕量級,但有些臃腫
-
SBT構建工具. 號稱 Maven 殺手, 但是從沒有優秀到替換它。難以學習和配置
-
非 servlet
-
Breaking changes across releases
例子
1
2
3
4
5
6
7
8
9
10
11
12
|
package controllers
import play.api._
import play.api.mvc._
class Application extends Controller {
def hello(name: String) = Action {
Ok( "Hello " + name + "!" )
}
} |
注解
抱怨歸抱怨,我還是一直喜歡和首選這個框架。不幸的是,我隻能給它4顆星。我堅信 基於JAX-RS的框架更適合 RESTful web services.
RESTEXPRESS
誕生時間: 2009
評分: 3/5
RestExpress是一個非容器的輕量級的 Netty HTTP棧的包裝, 以便更容易地創建 Java RESTful services.
RestExpress 目標是支持最好的 RESTful 實踐。
鏈接
GITHUB
優點
-
真正的微框架
-
頂級的性能,快,可靠
-
XML/JSON
-
最老的也是最穩定的 RESTful 框架之一
缺點
-
沒有文檔
-
幾乎沒有支持
-
很小的社區
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
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();
}
} |
注解
盡管這個框架超級快,我也不想推薦它。文檔缺乏以及沒有支持使它成為一個欠佳的框架。看在速度的份上給它3顆星。
RESTLET
誕生時間: 2005
評分: 4.5/5
Restlet 幫助Java程序員建立大規模的快速的符合 RESTful 架構模式的web api。
它 提供了強大的路由和 filtering 係統。統一的client/server Java API. 滿足所有主要的平台 (Java SE/EE, Google AppEngine, OSGi, GWT, Android) 以及提供了無數的擴展以滿足程序員的需求。
據我說知,它是第一個 java RESTful web 框架。很多公司都在用它,但是你可能從未聽說過它,好像它已經不可見了。
優點
-
強大
-
企業級的框架
-
多平台 Java SE, Java EE, Google Web Toolkit, Google AppEngine, Android, OSGi environments
-
支持JAX-RS (就像 Jersey)
-
大部分高級 RESTful 支持
-
模塊化
-
支持其它庫
-
開發一直活躍
-
智能的url綁定, 全功能的 URI 路由
-
有相關的書籍
缺點
-
非常陡峭的學習曲線
-
關閉的社區,盡管 StackOverflow 上還是開放的
-
不再流行,更多的是因為 Play Framework 和 Jersey
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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" ;
}
} |
注解
盡管這個框架還一直流行,考慮到它的年紀和當前的完成度,我不能給它5顆星。
RESTX
誕生時間: 2013
評分: 3.5/5
Restx 是一個輕量級的,模塊化的,特性眾多的,超快的開源 Java REST 框架。
優點
-
快速,輕量級
-
容易搭建
-
真正的微框架
-
模塊化
-
支持其它庫
-
支持MongoDB
缺點
-
不友好的令人迷惑的文檔。對於這類框架我期望能有好一點的文檔
-
太年輕
-
目前還不支持異步Async
例子
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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" )));
}
|
注解
真心來講我沒有在這個框架上花費太多時間。不值得在另一個框架上花費太多精力,我意思是說,Java框架市場已經越來越碎片化了,就像 JavaScript 市場,應該停止這種趨勢了。
SPARK FRAMEWORK
誕生時間: 2011
評分: 3.5/5
不要和 Apache 的大數據框架 Spark 弄混, 這裏的 Spark 框架是一個輕量級的 Java web 框架,用來進行快速的開發(50% Spark用戶使用 Spark 創建 REST APIs)。 它受 Ruby 框架 Sinatra 啟發。
它有一個不到1M的最小化的內核, 提供了所有基本的特性, 用來構建 RESTful 或者傳統的 web 應用程序。
優點
-
快,輕量級
-
優秀的快速原型
-
易於搭建
-
經常和AngularJS搭配使用
-
真正的微框架
-
使用 Jetty
-
可以用在容器中或者獨立運行
缺點
-
文檔可以更好,它不適合初學者
-
不適合大型項目
-
社區小
例子
1
2
3
4
5
6
7
|
import static spark.Spark.*;
public class HelloWorld {
public static void main(String[] args) {
get( "/hello" , (req, res) -> "Hello World" );
}
} |
注解
這個框架適合初始開發。主要用作小小項目或者原型。
最後更新:2017-09-25 16:33:18