最好的8个Java RESTful框架

过去的每一year,涌现出越来越多的Java框架。就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的。连我的老祖母现在也使用 一个我从来没有听说过而且可能永远不会使用的框架。玩笑归玩笑,可以做几乎任何事的臃肿的框架市场已经饱和,,但是如何评判呢?这篇文章旨在提供目前最好的 Java RESTfulful 框架。我只介绍轻量级的产品, 略过了那些臃肿的过度设计的框架。同时,我只想要他们稳定和成熟,提供简单,轻量级的特点。我只在介绍Play frameworks时打破这条规则,理由稍后给出。在将来的项目中使用哪个 Java RESTful框架完全取决于你当前的需求。为了便于你取舍,我将列出最突出的框架功能,希望这能节省一些你的时间。

Dropwizard

诞生时间: 2011
评分: 4.5/5

Dropwizard 提供了稳定成熟的Java库, 并封装成一个简单的轻量级的包。
Dropwizard 介于框架和库之间。它提供了一个开发web应用程序的全部所需。由于内置模块化,一个应用程序可以保持小而精干的特点,减少开发和维护的时间,减少负担。
Dropwizard 使用已有的 Jetty HTTP 库,嵌入到你的项目中,无需外部的server。所有的Dropwizard项目都有一个 main 方法来管理内建的 HTTP server.

链接
官方站点 GITHUB 文档

优点

快速的项目构建和启动

模块化

不可思议的快(至少根据内建的 metric 测得的结果)

Jetty for HTTP, Jersey for REST, 以及 Jackson for JSON

也支持其它的库, 比如 Mustache, Logback, JDBI, Hibernate Validator, Guava, …

使用Metrics支持监控

Main方法启动 Jetty server,可以容易地调试和维护

社区力度强

缺点

Dropwizard文档是主要的知识来源,但谈不上优秀。你可能需要搜索和发掘第三方类库的文档。

因为某些原因错误被当作普通文本, 如果你希望响应结果总是JSON,这可能有问题

确保使用最新的Dropwizard, 一些老版本使用了废弃的第三方库。 而且早期的Dropwizzard也很难升级

例子

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
   }

}

注解
个人不想为大的项目推荐这个框架。不过如果你想尝试的话,你不会失望的。主要是这个框架使用最好的现代的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 框架。

链接
官方站点 GITHUB 文档

优点

优秀的文档和例子

快速

超级容易的路由

平滑的 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 不可用

例子

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中就可以开始编码了。

链接
官方站点 GITHUB 文档

优点

快速的项目构建和启动

模块化

XML, HTML, JSON渲染

也支持其它的库 (如 Guice, Logback, Guava, etc.)

很好的数据持久化和缓存

不喜欢 servlet container? U可以选择你喜欢的容器

如果根本就不喜欢容器,可以使用 standalone 模式, 使用Jetty作为一个自执行的jar

缺点

同样,就像DropWizzard, 文档有但是不够好。我花了好长时间去了解它。这个框架也依赖很多其它的库,有时候想得到所需的信息很麻烦。

不怎么出名,社区小。 有谣言说这个框架是由那些切换到Scala的 Play 2.X 用户创建的

例子

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和内存消耗的应用。

链接
官方站点 GITHUB 文档

优点

易于开发

快,但是没有其它的一些框架快

基于 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

例子

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 框架之一

缺点

没有文档

几乎没有支持

很小的社区

例子

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 框架。很多公司都在用它,但是你可能从未听说过它,好像它已经不可见了。

链接
官方站点 GITHUB 文档

优点

强大

企业级的框架

多平台 Java SE, Java EE, Google Web Toolkit, Google AppEngine, Android, OSGi environments

支持JAX-RS (就像 Jersey)

大部分高级 RESTful 支持

模块化

支持其它库

开发一直活跃

智能的url绑定, 全功能的 URI 路由

有相关的书籍

缺点

非常陡峭的学习曲线

关闭的社区,尽管 StackOverflow 上还是开放的

不再流行,更多的是因为 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" ;
   }

}

注解
尽管这个框架还一直流行,但到它的和当前的完成度,我不能给它5颗星。

Restx

诞生时间: 2013
评分: 3.5/5

Restx 是一个轻量级的,模块化的,特性众多的,超快的开源 Java REST 框架。

链接
官方站点 GITHUB 文档

优点

快速,轻量级

容易搭建

真正的微框架

模块化

支持其它库

支持MongoDB

缺点

不友好的令人迷惑的文档。对于这类框架我期望能有好一点的文档

太young

目前还不支持异步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" )));
   }

注解
真心来讲我没有在这个框架上花费太多时间。不值得在另一个框架上花费太多精力,我意思是说,Java框架市场已经越来越碎片化了,就像 JavaScript 市场,应该停止这种趋势了。

Spark Framework

诞生时间: 2011
评分: 3.5/5
不要和 Apache 的大数据框架 Spark 弄混, 这里的 Spark 框架是一个轻量级的 Java web 框架,用来进行快速的开发(50% Spark用户使用 Spark 创建 REST APIs)。 它受 Ruby 框架 Sinatra 启发。

它有一个不到1M的最小化的内核, 提供了所有基本的特性, 用来构建 RESTful 或者传统的 web 应用程序。

链接
官方站点 GITHUB 文档

优点

快,轻量级

优秀的快速原型

易于搭建

经常和AngularJS搭配使用

真正的微框架

使用 Jetty

可以用在容器中或者独立运行

缺点

文档可以更好,它不适合初学者

不适合大型项目

社区小

例子

import static spark.Spark.*;

public class HelloWorld {
  public static void main(String[] args) {
    get( "/hello" , (req, res) -> "Hello World" );
  }
}

注解
这个框架适合初始开发。主要用作小小项目或者原型。

(0)

相关推荐

  • wdcp添加tomcat,同时支持php和java教程

    用wdcp官方提供的脚本安装lnamp环境,安装请参考:http://www.wdlinux.cn/bbs/thread-6292-1-1.html,本文主要讲如何在LNAMP环境下安装JDK+Tomcat6使同一台服务器同时支持PHP和JAVA语言.服务器系统和各软件版本如下所示 [root@E ~]# uname -a Linux E.CentOS6.4 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_

  • java集合迭代器Iterator中的remove陷阱

    package TestList; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.TreeSet; public class TestIterator { /**      * @param args      */     public static void main(String[] args) {         // TODO Auto-gen

  • PHP.vs.JAVA

    现在市场上的OA基本上可归结为两大阵营,即php阵营和java阵营.但对接触Oa不久的用户来说,看到的往往只是它们的表相,只是明显的价格差异,却很难看出它们之间的实际差异.其实, PHP + MYSQL 不值钱不仅仅局限于oa软件,而是整体上PHP + MYSQL开发的软件都不如java开发的软件值钱.为什么PHP + MYSQL 的OA为什么不值钱呢?首先得明白php和java之间的差异才行. 1.系统的技术架构比较  分层是将系统进行有效组织的方式,分而治之的思想是计算机领域中非常重要的思想

  • java解析php函数json_encode unicode 编码问题

    android开发中在和服务器端接口对接时出现编码问题,从服务器端获取到的数据是 "\u8bbe\u59071ID-\u8bbe\u59071\u540d\u79f0;\u8bbe\u59073id-\u8bbe\u59073\u540d\u79f0;\u8bbe\u59077id-\u8bbe\u59077\u540d\u79f0" 接口是通过php函数中json_encode进行编码后返回的,在客户端通过java.net.URLdecoder.decode()解码不管用,但是直接将

  • java 集合----Map、Collection

    接口:红色:实现类:黑色字体 一. Collection集合  Collection  |_____Set(HashSet)  |      |_____SortedSet(TreeSet)  |_____List(ArrayList,LinkedList,Vector )   Collection:集合层次中的根接口,JDK没有提供这个接口的实现类. List: 有序(按照放入的顺序).可以重复.有下标. Set:无序.不可以重复.无下标. SortedSet:是Set接口的子接口,Sorte

  • java多线程抓取铃声多多官网的铃声数据

    一直想练习下java多线程抓取数据. 有天被我发现,铃声多多的官网(http://www.shoujiduoduo.com/main/)有大量的数据. 通过观察他们前端获取铃声数据的ajax http://www.shoujiduoduo.com/ringweb/ringweb.php?type=getlist&listid={类别ID}&page={分页页码} 很容易就能发现通过改变 listId和page就能从服务器获取铃声的json数据, 通过解析json数据, 可以看到都带有{&q

  • Java模版引擎Freemarker

    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件 FreeMarker与容器无关,因为它并不知道HTTP或Servlet:FreeMarker同

  • javascript的BOM

    javascript的BOM ECMAScript是 JavaScript的核心,但如果要在 Web中使用 JavaScript,那么 BOM(浏览器对象模型)则无疑才是真正的核心.BOM 提供了很多对象,用于访问浏览器的功能,这些功能与任何网页内容无关.多年来,缺少事实上的规范导致 BOM既有意思又有问题,因为浏览器提供商会按照各自的想法随意去扩展它.于是,浏览器之间共有的对象就成为了事实上的标准.这些对象在浏览器中得以存在,很大程度上是由于它们提供了与浏览器的互操作性.W3C为了把浏览器中

  • JAVAEE项目结构以及并发随想

    长久以来统领javaee领域的脚手架以spring  struts2 mybatis/hibernate引领: Spring: Spring is not just for Java services.spring作为cgi标准的实现,并不仅仅是作为Java领域的框架,C#平台依旧可以获益:spring提供了抽象化等各种方便的注解配置方式或者bootde 一体化方案,极大简化了Javaee的项目基础: 在spring的使用过程中,两面分化,一部分,轻量注解,一部分倾向于全注解. 首先注解的前提是

  • java synchronized关键字的用法

    0.先导的问题代码 下面的代码演示了一个计数器,两个线程同时对i进行累加的操作,各执行1000000次.我们期望的结果肯定是i=2000000.但是我们多次执行以后,会发现i的值永远小于2000000.这是因为,两个线程同时对i进行写入的时候,其中一个线程的结果会覆盖另外一个. public class AccountingSync implements Runnable { static int i = 0; public void increase() { i++; } @Override

  • java URL 获取PHP JSON 数据

    1:php地址  http://127.0.0.6/?c=json 2:java 输出的结果是 [{"id":1,"name":"zhdc"},{"id":2,"name":"\u5c0f\u6731"}] index.php <?php if(isset($_REQUEST['c'])){ $c = $_REQUEST['c']; if($c == "json"

  • 设置JavaScript自动提示-Eclipse/MyEclipse

    我在Eclipse/MyEclipse环境下都测试过了,都好使. 需要2个组件,分别是:  ext-4.0.2a.jsb2 spket-1.6.16.jar dowload address: spket-1.6.16.jar:http://www.jb51.net/softs/456448.html ext-4.0.2a.jsb2:http://www.jb51.net/softs/456440.html 我的网盘里面有,大家可以下载! 开始教程: 安装 spket 打开你的Eclipse你就会

  • Mybatis与Ibatis的区别

    Mybatis与Ibatis的区别: 1.Mybatis实现了接口绑定,使用更加方便 在ibatis2.x中我们需要在DAO的实现类中指定具体对应哪个xml映射文件, 而Mybatis实现了DAO接口与xml映射文件的绑定,自动为我们生成接口的具体实现,使用起来变得更加省事和方便. 这可以说是Mybatis最重要的改进. 注意: 虽然Mybatis支持在接口中直接使用annotation的配置方式来简化配置, 不过强烈建议仍然使用xml配置的方式.毕竟annotation的配置方式功能有限且代码

  • java常用正则表达式

    "^/d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-/d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?/d+$" //整数 "^/d+(/./d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+/.[0-9]*[1-9][0-

  • base64_encode和base64_decode的JAVA实现

    Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,大家可以查看RFC2045-RFC2049,上面有MIME的详细规范. Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3 php 的函数:base64_encode() 和 base64_decode() base64的编,解码原理 Base64 编码其实是将3个8位字节转换为4

  • Java URL自定义私有网络协议

    --声明,脑残人士远离,本博客的核心不是if-else+前缀,而是如何通过URL协议处理框架定义私有协议 URI与URL的区别 URI (uniform resource identifier)统一资源标志符:URL(uniform resource location )统一资源定位符(或统一资源定位器):URI是一个相对来说更广泛的概念,URL是URI的一种,是URI命名机制的一个子集,可以说URI是抽象的,而具体要使用URL来定位资源.URI指向的一般不是物理资源路径,而是整个系统中的映射后

随机推荐