最好的8个Java RESTful框架
过去的每一year,涌现出越来越多的Java框架。就像JavaScript,每个人都认为他们知道一个好的框架的功能应该是怎么样的。连我的老祖母现在也使用一个我从来没有听说过而且可能永远不会使用的框架。玩笑归玩笑,可以做几乎任何事的臃肿的框架市场已经饱和,,但是如何评判呢?这篇文章旨在提供目前最好的JavaRESTfulful框架。我只介绍轻量级的产品,略过了那些臃肿的过度设计的框架。同时,我只想要他们稳定和成熟,提供简单,轻量级的特点。我只在介绍Playframeworks时打破这条规则,理由稍后给出。在将来的项目中使用哪个JavaRESTful框架完全取决于你当前的需求。为了便于你取舍,我将列出最突出的框架功能,希望这能节省一些你的时间。
Dropwizard
诞生时间:2011
评分:4.5/5
Dropwizard提供了稳定成熟的Java库,并封装成一个简单的轻量级的包。
Dropwizard介于框架和库之间。它提供了一个开发web应用程序的全部所需。由于内置模块化,一个应用程序可以保持小而精干的特点,减少开发和维护的时间,减少负担。
Dropwizard使用已有的JettyHTTP库,嵌入到你的项目中,无需外部的server。所有的Dropwizard项目都有一个main方法来管理内建的HTTPserver.
链接
官方站点 GITHUB 文档
优点
快速的项目构建和启动
模块化
不可思议的快(至少根据内建的metric测得的结果)
JettyforHTTP,JerseyforREST,以及JacksonforJSON
也支持其它的库,比如Mustache,Logback,JDBI,HibernateValidator,Guava,…
使用Metrics支持监控
Main方法启动Jettyserver,可以容易地调试和维护
社区力度强
缺点
Dropwizard文档是主要的知识来源,但谈不上优秀。你可能需要搜索和发掘第三方类库的文档。
因为某些原因错误被当作普通文本,如果你希望响应结果总是JSON,这可能有问题
确保使用最新的Dropwizard,一些老版本使用了废弃的第三方库。而且早期的Dropwizzard也很难升级
例子
packagecom.example.helloworld; importio.dropwizard.Application; importio.dropwizard.setup.Bootstrap; importio.dropwizard.setup.Environment; importcom.example.helloworld.resources.HelloWorldResource; importcom.example.helloworld.health.TemplateHealthCheck; publicclassHelloWorldApplicationextendsApplication<HelloWorldConfiguration>{ publicstaticvoidmain(String[]args)throwsException{ newHelloWorldApplication().run(args); } @Override publicStringgetName(){ return"hello-world"; } @Override publicvoidinitialize(Bootstrap<HelloWorldConfiguration>bootstrap){ //nothingtodoyet } @Override publicvoidrun(HelloWorldConfigurationconfiguration, Environmentenvironment){ //nothingtodoyet } }
注解
个人不想为大的项目推荐这个框架。不过如果你想尝试的话,你不会失望的。主要是这个框架使用最好的现代的Javaweb组件,组装成一个简单易用的框架。
不幸的是这也带来了它的问题。将这些库糅合起来可能导致不可预见的问题。这也是我为什么给它减掉0.5颗星,而没有评为满分5颗星。
Jersey
诞生时间:2012(Jersey2.X)
评分:5/5
JerseyRESTful框架是开源的RESTful框架,实现了JAX-RS(JSR311&JSR339)规范。它扩展了JAX-RS实现,提供了更多的特性和工具,可以进一步地简化RESTfulservice和client开发。尽管相对新怡,它已经是一个产品级的RESTfulservice和client框架。
链接
官方站点 GITHUB 文档
优点
优秀的文档和例子
快速
超级容易的路由
平滑的JUnit集成
就个人而言,当开发RESTfulservice时,JAX-RS实现要好于MVC框架。
可以集成到其它库/框架(Grizzly, Netty).这也可能是很多产品使用它的原因。
支持异步链接
不喜欢servletcontainer?使用Jersey的时候可以不用它们。
WADL,XML/JSONsupport
包含在Glassfish中
缺点
Jersey2.0+使用了有些复杂的依赖注入实现
可能不是一件坏事。Jersey1.X使用较老的JAX-RS实现
一大堆第三方库只支持Jersey1.X,在Jersey2.X不可用
例子
packageorg.glassfish.jersey.examples.helloworld; importjavax.ws.rs.GET; importjavax.ws.rs.Path; importjavax.ws.rs.Produces; @Path("helloworld") publicclassHelloWorldResource{ publicstaticfinalStringCLICHED_MESSAGE="HelloWorld!"; @GET @Produces("text/plain") publicStringgetHello(){ returnCLICHED_MESSAGE; } }
注解
Jersey是我的选择,5颗星。
NinjaWebFramework
诞生时间:2012
评分:3.5/5
NinjaWebFramework是全栈的javawebframework。稳定,快速,可靠,产品级.
它提供了开发,测试,发布,维护RESTfulweb应用的一切(Servlets,Guice,JPA,Flywaymigrations,Maven,etc.).
就像DropWizzard,NinjaWebFramework是一个集成的软件栈。你不必建立你自己的,只需使用Mavenarchetype生成一个新的项目,导入到IDE中就可以开始编码了。
链接
官方站点 GITHUB 文档
优点
快
快速的项目构建和启动
模块化
XML,HTML,JSON渲染
也支持其它的库(如Guice,Logback,Guava,etc.)
很好的数据持久化和缓存
不喜欢servletcontainer?U可以选择你喜欢的容器
如果根本就不喜欢容器,可以使用standalone模式,使用Jetty作为一个自执行的jar
缺点
同样,就像DropWizzard,文档有但是不够好。我花了好长时间去了解它。这个框架也依赖很多其它的库,有时候想得到所需的信息很麻烦。
不怎么出名,社区小。有谣言说这个框架是由那些切换到Scala的Play2.X用户创建的
例子
packagecontrollers; publicclassApplicationController{ publicResultindex(){ Personperson=newPerson(); person.name="JohnJohnson"; returnResults.json().render(person); } }
注解
看起来不错,但是在它成熟之前我还是把它丢在一边吧。
PlayFramework
诞生时间:2011
评分:4/5
使用PlayFramework很容易地创建,构建和发布web应用程序,支持Java&Scala。它使用Akka,基于一个轻量级的无状态的架构。它应该应用于大规模地低CPU和内存消耗的应用。
链接
官方站点 GITHUB 文档
优点
易于开发
快,但是没有其它的一些框架快
基于Netty,支持非阻塞的I/O.并行处理远程调用的时候很优秀
社区很大
快速的项目构建和启动
模块化
MVC
REST,JSON/XML,WebSockets,non-blockingI/O
只需刷新浏览器就可以看到最新的改变
支持Async
有出版的书
缺点
版本2.0是最有争议的Java框架。切换至SwitchtoScalamadesomeJavadevelopersoutraged.
不向后兼容;Play2.X重写了
号称轻量级,但有些臃肿
SBT构建工具.号称Maven杀手,但是从没有优秀到替换它。难以学习和配置
非servlet
Breakingchangesacrossreleases
例子
packagecontrollers importplay.api._ importplay.api.mvc._ classApplicationextendsController{ defhello(name:String)=Action{ Ok("Hello"+name+"!") } }
注解
抱怨归抱怨,我还是一直喜欢和首选这个框架。不幸的是,我只能给它4颗星。我坚信基于JAX-RS的框架更适合RESTfulwebservices.
RestExpress
诞生时间:2009
评分:3/5
RestExpress是一个非容器的轻量级的NettyHTTP栈的包装,以便更容易地创建JavaRESTfulservices.
RestExpress目标是支持最好的RESTful实践。
链接
GITHUB
优点
真正的微框架
顶级的性能,快,可靠
XML/JSON
最老的也是最稳定的RESTful框架之一
缺点
没有文档
几乎没有支持
很小的社区
例子
packagecom.example; importjava.io.IOException; importio.netty.handler.codec.http.HttpMethod; importorg.restexpress.RestExpress; publicclassMain { publicstaticRestExpressstartServer(String[]args)throwsIOException { RestExpressserver=newRestExpress(); MyResourcer=newMyResource(); server.uri("/myapp/myresource",r) .method(HttpMethod.GET) .noSerialization(); server.uri("/myapp/myresource",r) .method(HttpMethod.POST); server.bind(8080); returnserver; } publicstaticvoidmain(String[]args)throwsException { RestExpressserver=startServer(args); System.out.println("Hitentertostopit..."); System.in.read(); server.shutdown(); } }
注解
尽管这个框架超级快,我也不想推荐它。文档缺乏以及没有支持使它成为一个欠佳的框架。看在速度的份上给它3颗星。
Restlet
诞生时间:2005
评分:4.5/5
Restlet帮助Java程序员建立大规模的快速的符合RESTful架构模式的webapi。
它提供了强大的路由和filtering系统。统一的client/serverJavaAPI.满足所有主要的平台(JavaSE/EE,GoogleAppEngine,OSGi,GWT,Android)以及提供了无数的扩展以满足程序员的需求。
据我说知,它是第一个javaRESTfulweb框架。很多公司都在用它,但是你可能从未听说过它,好像它已经不可见了。
链接
官方站点 GITHUB 文档
优点
强大
企业级的框架
多平台JavaSE,JavaEE,GoogleWebToolkit,GoogleAppEngine,Android,OSGienvironments
支持JAX-RS(就像Jersey)
大部分高级RESTful支持
模块化
支持其它库
开发一直活跃
智能的url绑定,全功能的URI路由
有相关的书籍
缺点
非常陡峭的学习曲线
关闭的社区,尽管StackOverflow上还是开放的
不再流行,更多的是因为PlayFramework和Jersey
例子
publicclassPart03extendsServerResource{ publicstaticvoidmain(String[]args)throwsException{ //CreatetheHTTPserverandlistenonport8182 newServer(Protocol.HTTP,8182,Part03.class).start(); } @Get("txt") publicStringtoString(){ return"hello,world"; } }
注解
尽管这个框架还一直流行,但到它的和当前的完成度,我不能给它5颗星。
Restx
诞生时间:2013
评分:3.5/5
Restx是一个轻量级的,模块化的,特性众多的,超快的开源JavaREST框架。
链接
官方站点 GITHUB 文档
优点
快速,轻量级
容易搭建
真正的微框架
模块化
支持其它库
支持MongoDB
缺点
不友好的令人迷惑的文档。对于这类框架我期望能有好一点的文档
太young
目前还不支持异步Async
例子
@GET("/message/{id}") publicMessagesayHello(Stringid,//pathparam Stringwho//queryparam ){ returnnewMessage().setMessage(String.format( "hello%s,it's%s", who,DateTime.now().toString("HH:mm:ss"))); } @POST("/message/{id}") publicMessagesayHello(Stringid,//pathparam Messagemsg//bodyparam ){ returnmsg.setMessage(String.format( "%s@%s", msg.getMessage(),DateTime.now().toString("HH:mm:ss"))); }
注解
真心来讲我没有在这个框架上花费太多时间。不值得在另一个框架上花费太多精力,我意思是说,Java框架市场已经越来越碎片化了,就像JavaScript市场,应该停止这种趋势了。
SparkFramework
诞生时间:2011
评分:3.5/5
不要和Apache的大数据框架Spark弄混,这里的Spark框架是一个轻量级的Javaweb框架,用来进行快速的开发(50%Spark用户使用Spark创建RESTAPIs)。它受Ruby框架Sinatra启发。
它有一个不到1M的最小化的内核,提供了所有基本的特性,用来构建RESTful或者传统的web应用程序。
链接
官方站点 GITHUB 文档
优点
快,轻量级
优秀的快速原型
易于搭建
经常和AngularJS搭配使用
真正的微框架
使用Jetty
可以用在容器中或者独立运行
缺点
文档可以更好,它不适合初学者
不适合大型项目
社区小
例子
importstaticspark.Spark.*; publicclassHelloWorld{ publicstaticvoidmain(String[]args){ get("/hello",(req,res)->"HelloWorld"); } }
注解
这个框架适合初始开发。主要用作小小项目或者原型。