BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

JAX-RS 2.0中有什么新特性?

| 作者 Vikram Gupta 关注 1 他的粉丝 ,译者 张卫滨 关注 13 他的粉丝 发布于 2013年7月7日. 估计阅读时间: 8 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

Marc Hadley和Paul Sandoz领导的JSR-311规范在2008年第一次发布JAX-RS 1.0时,它成为了最早的基于POJO/注解的框架之一,这些框架致力于创建健壮的Web应用程序。

现在,五年的时间过去了,Java EE7已经发布并且包含了最新的JAX-RS 2.0版本,它是Marek Potociar和Santiago Pericas-Geertsen领导的JSR-339实现。我们将看一下JAX-RS 2.0的一些关键特性,但首先让我们回顾一下JAX-RS 1.0。

1  @Path(portfolios) 
2  public class PortfolioResource { 
3     
4    @GET 
5    public Collection<Portfolio> allPortfolios() { 
6      . . . 
7    } 
8     
9    @GET 
10   public Portfolio getPortfolio(
          @PathParam("portfolioId") String id) { 
11     . . .
12   }
13 }

在上面的代码列表中,第一行表明要将这个资源与相对路径“/portfolios”进行匹配。第四行表明GET请求将会返回所有的portfolios。第九行和第十行表明像/portfolios/123这样的URL将会把资源URL(如portfolios)后面的参数抽取出来(如123)并将它赋值给“id”变量,然后返回相关联的portfolio。

在JAX-RS 2.0中保留了类似的语法。

JAX-RS 2.0符合了Java EE 7的中心主题,添加了一些长久以来一直期待的特性,这些特性主要关注于Oracle所宣称的“简化的API”。

这些特性可以列举如下:

  • 客户端API
  • 异步
  • HATEOAS(超媒体)
  • 注解
  • 校验
  • 过滤器和处理器(Handler)
  • 内容协商

我们会快速了解一下以上所列的每一项特性:

客户端API

JAX-RS 1.0是一个严格的服务端API。有一些实现提供了不同程度的客户端支持,但是一般来讲开发人员需要安装专门的东西,像Apache软件基金会的Jakarta Commons HttpClient或者WizTools的REST Client

JAX-RS 2.0添加了“生成器(builder)”工具用于从客户端调用Web服务。以下为一个样例:

  Client client=ClientFactory.newClient();
  String shares=client.target("http://.../portfolio/123")
      .pathParam("identifier", "IBM")
      .queryParameter("identifierType", "ticker")
      .request("text/plain).get(String.class");

你可以看到这个方法首先获取了一个客户端,然后使用生成器模式(builder pattern)来构建URL的所有参数,这样的话就能让应用程序的开发人员格式化URL,而不用处理构建URL的奇特行为。

对于调用带有HTTP体的请求,这种方式尤其有效,如HTTP POST以及HTTP PUT。以下的样例可以卖出IBM的100股股票:

Stock stock=client.target("http://.../portfolio/123/sell")
        .pathParam("identifier", "IBM")
        .queryParameter("identifier", "ticker")
        .request("application/json")
        .post(text("100", Shares.class));

异步

在JAX-RS 1.0中,发起调用的客户端必须等待服务端的响应。2.0引入了异步的支持。这样的话就允许客户端发起一个RESTful的请求,并得到一个Future或an InvocationCallback,当响应完成的时候会获得通知。

HATEOAS(超媒体)

按照REST盲从者的正统(RESTafarian Orthodoxy),如果你没有使用HATEOAS的话,那你就不是在使用REST!HATEOAS(Hypermedia as the Engine of Application State,超媒体作为应用程序状态引擎)需要RESTful的生产者和消费者在每次调用时返回一组达成共识的链接,它用于导航到下一个步骤。如果你将REST视为Web页面的应用版本,那么HATEOAS可以视为Web页面中的链接。

JAX-RS 2.0提供了Link和Target类,它们用于服务器端在响应中引入超链接并在客户端对其进行响应。

注解

引入了新的注解,例如为了支持新注入的注解。

Bean校验

会有一个基于注解的基础设施来指明元数据参数。例如“@NotNull shares”表明“shares”参数不能为null。你还可以提供自定义的注解,例如保证一定的数据格式,像邮政编码或电话号码。

过滤器和处理器

Filter API允许将servlet的过滤器放到一个链中,遵循责任链模式。如果要引入一些正交的关注点,如日志,那么它会很有用。任何的过滤器都可以继续或终止这个链,这是通过分别调用FilterAction.NEXT和FilterAction.STOP做到的。

处理器(handler)与过滤器很类似,但是它们会在一个特定的扩展点中包装方法调用。如果要拦截这个扩展点的调用,这种方式会很有用,例如要缓解或扩充负载数据。

内容协商

更为丰富的参数注解@Accepts和@Produces能够让你优先安排请求/响应的格式。

JAX-RS依然缺乏很好的安全模型,对于面向外部的企业级应用程序就很难使用了。我们希望下一个释放版本能够提供点对点的认证。

主流的JEE容器可能还需要一些时间才能支持JAX-RS 2.0。不过你可以将最新版本的Jersey与应用程序一起部署,这样就能使用这些特性了。Oracle已经宣布了在WebLogic 12c中做到这一点的步骤。

要了解更多的信息,请查看JSR 339专家组成员Adam Bien在OTN上的文章Java EE 7 and JAX-RS 2.0

原文链接:What's New in JAX-RS 2.0?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT